Сжатие фрейма данных в R - PullRequest
0 голосов
/ 10 июля 2011

У меня просто простой вопрос, я действительно ценю вклад каждого, вы очень помогли моему проекту.У меня есть дополнительный вопрос о фреймах данных в R.

У меня есть фрейм данных, который выглядит примерно так:

    C <- c("","","","","","","","A","B","D","A","B","D","A","B","D")
    D <- c(NA,NA,NA,2,NA,NA,1,1,4,2,2,5,2,1,4,2)
    G <- list(C=C,D=D)
    T <- as.data.frame(G)
    T
   C  D
1     NA
2     NA
3     NA
4     2
5     NA
6     NA
7     1
8  A  1
9  B  4
10 D  2
11 A  2
12 B  5
13 D  2 
14 A  1
15 B  4
16 D  2 

Я бы хотел сжать все повторяющиеся символыв один, и выглядят примерно так:

    J B C E
  1   2 1
  2 A 1 2 1
  3 B 4 5 4
  4 D 2 2 2

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

РЕДАКТИРОВАТЬ Я отредактировал пример, потому что он не работалс ответами пока.Интересно, вносят ли NA, пробелы и неравномерность из заготовок ??

Ответы [ 3 ]

1 голос
/ 10 июля 2011

Изменено T на df, чтобы избежать вредной привычки.Возвращает список, который может быть не тем, что вы хотите, но вы можете конвертировать оттуда.

C <- c("A","B","D","A","B","D","A","B","D")
D <- c(1,4,2,2,5,2,1,4,2)
my.df <- data.frame(id=C,val=D)

ret <- function(x) x
by.df <- by(my.df$val,INDICES=my.df$id,ret)
1 голос
/ 14 июля 2014

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

T <- na.omit(T)
T$ind <- ave(1:nrow(T), T$C, FUN = seq_along)
reshape(T, direction = "wide", idvar = "C", timevar = "ind")
#    C D.1 D.2 D.3
# 4      2   1  NA
# 8  A   1   2   1
# 9  B   4   5   4
# 10 D   2   2   2

library(reshape2)
dcast(T, C ~ ind, value.var = "D", fill = "")
#   C 1 2 3
# 1   2 1  
# 2 A 1 2 1
# 3 B 4 5 4
# 4 D 2 2 2
1 голос
/ 10 июля 2011

вот решение по изменению формы:

require(reshape)
cast(T, C ~ ., function(x) x)
...