Як розгорнути кадр даних в R


15

У мене виникає наступна проблема під час аналізу аналізу з Р.

У мене є такий кадр даних:

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-combination. Не вдається знайти жодних хороших слів для пошуку в Інтернеті.


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

Ви повинні вивчити reshape2пакунок у Р. Це також може допомогти dputдвом прикладним фреймам даних: одному з введенням і одному з вихідним.
Зак

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

Дякую Gaël за відповідь та допомогу у форматуванні мого запитання.
Juha-Matti S.

Відповіді:


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

@chl, ви, пан, геніальний!
Кріс

15

Ви можете використовувати функцію untable з пакету переформатування.

З огляду на вищезазначений 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робить саме те, що я згадав у своєму коментарі :-) Дякую, що нагадав мені про цю функцію!
chl

1

І uncountвідtidyr тепер дає той же результат , як і вище.

library(tidyr)
df %>% uncount(Count)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.