Изменить строки на столбцы и сгруппировать по - PullRequest
0 голосов
/ 03 июня 2019

У меня относительно большой DF, и теперь мне нужен способ сделать столбцы из строк.

Мой DF выглядит так:

AID FNAME FVALUE
1   A     10
1   B     12
1   C     16
2   A     10
2   E     4
3   F     10
3   G     13

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

AID A B C D E F G H 
1   10 12 16 NULL NULL NULL NULL
2   10 NULL NULL NULL 4 NULL NULL NULL
3   NULL NULL NULL NULL NULL 10 13 NULL

Я пробовал с распространением:

wide_DF <- unite_DF %>% spread(FNAME, FVALUE)

но я получаю ошибку:

Ошибка: каждая строка вывода должна быть идентифицирована уникальной комбинацией клавиш.

Также я попытался сгруппировать данные и вставить новый уникальный столбец:

unite_DF  %>% group_by(AID) %>% mutate(ind = row_number()) %>% spread(FNAME, FVALUE) %>% select(Name, Value)

Но здесь я тоже получаю ту же ошибку. Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Кажется, вы ищете reshape:

AID <- c(1, 1, 1, 2, 2, 3, 3)
FNAME <- c("A", "B", "C", "A", "E", "F", "G")
FVALUE <- c(10, 12, 16, 10, 4, 10, 13)

df <- data.frame(AID, FNAME, FVALUE)

df_wide <- reshape(df, direction = "wide", idvar = "AID", v.names = "FVALUE", timevar = "FNAME")
1 голос
/ 03 июня 2019

Мы можем использовать spread после преобразования 'FNAME' в factor с указанным levels и в spread, используйте drop = FALSE, чтобы избежать падения столбцов без комбинаций

library(tidyverse)
unite_DF %>% 
  mutate(FNAME = factor(FNAME, levels = LETTERS[1:8])) %>% 
  spread(FNAME, FVALUE, drop = FALSE)
#   AID  A  B  C  D  E  F  G  H
#1   1 10 12 16 NA NA NA NA NA
#2   2 10 NA NA NA  4 NA NA NA
#3   3 NA NA NA NA NA 10 13 NA

данные

unite_DF <- structure(list(AID = c(1L, 1L, 1L, 2L, 2L, 3L, 3L), FNAME = c("A", 
"B", "C", "A", "E", "F", "G"), FVALUE = c(10L, 12L, 16L, 10L, 
4L, 10L, 13L)), class = "data.frame", row.names = c(NA, -7L))
...