Как расширить фрейм данных в R


15

У меня возникла следующая проблема при проведении анализа с R.

У меня есть такой кадр данных:

Name | Group | Count
Person 1 | A | 3
Person 2 | A | 1
Person 3 | A | 0
Person 1 | B | 5 
Person 2 | B | 0
Person 3 | B | 1
Person 1 | C | 1

и мне нужно «расширить» его (не уверен, что правильный термин), чтобы быть таким:

Person 1 | A
Person 1 | A
Person 1 | A
Person 2 | A
Person 1 | B
Person 1 | B

и т.п.

Таким образом, он принимает значение пары Person 1 и A (в данном примере 3) и составляет три строки с Person 1 и A и делает это для каждой комбинации Person - Group. Не могу найти хорошие слова для поиска в Интернете.


Попробуйте reshape()функцию
гость

Вам следует изучить reshape2пакет в R. Это также может помочь в dputдвух примерах фреймов данных: один с вводом, а другой с выводом.
Зак

Я дал ответ, но думаю, что это больше вопрос программирования на R, чем статистический вопрос, поэтому, возможно, его следует перенести куда-нибудь еще.
Гала,

Спасибо Gaël за ответ и помощь с форматированием в моем вопросе.
Юха-Матти С.

Ответы:


10

Несмотря на то , что это очень полезный пакет, я думаю , изменение свойств является излишеством в этом случае, представитель может сделать эту работу.

Вот некоторые примеры данных:

df <- data.frame(
     name=c("Person 1", "Person 2", "Person 3", "Person 1", "Person 2", "Person 3"),
     group=c("A", "A", "A", "B", "B", "B"),
     count=c(3,1,0,5,0,1))

Теперь, чтобы «расширить» это:

expanded <- data.frame(name = rep(df$name, df$count),
                       group = rep(df$group, df$count))

Я не мог найти способ работать непосредственно с фреймом данных на макушке головы, поэтому я работаю над каждой переменной в отдельности, а затем собираю их, что немного уродливо, но должно быть в порядке, если вы позаботитесь о том, чтобы всегда использовать та же самая переменная для подсчета.


7
Как насчет этого: df[rep(seq_len(nrow(df)), df$count), 1:2]?
ЧЛ

@ CHL, вы, сэр, великолепны!
Крис

15

Вы можете использовать нестабильную функцию из пакета reshape.

Учитывая вышеупомянутое df (@ Gaël Laurans)

library(reshape)

expanded<-untable(df[,c(1,2)], num=df[,3])

name group
1   Person 1     A
1.1 Person 1     A
1.2 Person 1     A
2   Person 2     A
4   Person 1     B
4.1 Person 1     B
4.2 Person 1     B
4.3 Person 1     B
4.4 Person 1     B
6   Person 3     B

untableделает именно то, что я упомянул в своем комментарии :-) Спасибо за напоминание мне об этой функции!
ЧЛ

1

И uncountот tidyrтеперь дает тот же результат , как и выше.

library(tidyr)
df %>% uncount(Count)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.