使用nrow~n Group元素和列出的向量的ncol~n元素将聚合数据帧转换为数据帧

时间:2017-01-20 11:33:03

标签: r dataframe

我将一个函数应用于这样的数据框

> head(df,16)
   ID    Area time
1   1 182.685    1
2   2 182.714    1
3   3 182.275    1
4   4 211.928    1
5   5 218.804    1
6   6 183.445    1
7   7 209.161    1
8   8 205.231    1
9   1 189.743    2
10  2 190.164    2
11  3 189.310    2
12  4 222.414    2
13  5 229.056    2
14  6 191.121    2
15  7 219.344    2
16  8 214.662    2
> autocorr1 <- aggregate(x=df$Area,by=list(df$ID), FUN=acf.fft)

..我得到了这个数据框:

  Group.1 x
1       1 c(1, 0.925757424630699, 0.858465741115086, 0.7..

我想将其转换为这样的数据框:

Group.1 x1                x2                 x3   
1     1  1 0.925757424630699  0.858465741115086  0.7..

我尝试了as.data.frame(unlist())lapply,但两者都给了我一个连续的单列数据框:

test1 <- do.call(rbind, lapply(autocorr1$x, data.frame, stringsAsFactors=FALSE))
test2 <- as.data.frame(unlist(autocorr1$x))

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是使用dplyrtidyr包,如下所示,

library(dplyr)
library(tidyr)

df %>% 
 group_by(ID) %>% 
 summarise(new = toString(acf.fft(Area))) %>% 
 separate(new, c(paste0('X', 1:ncol(.))), ', ')

# A tibble: 8 × 3
#     ID    X1    X2
#* <int> <chr> <chr>
#1     1     1    -1
#2     2     1    -1
#3     3     1    -1
#4     4     1    -1
#5     5     1    -1
#6     6     1    -1
#7     7     1    -1
#8     8     1    -1

但是,如果您只想使用基数R,那么您可以splitapplyrbind,即

setNames(data.frame(unique(df$ID) ,do.call(rbind,lapply(split(df, df$ID),function(i) 
                                   acf.fft(i$Area)))), c('ID',paste0('X', 1:max(df$time))))

答案 1 :(得分:0)

我们可以使用data.table

以紧凑的方式完成此操作
library(data.table)
setDT(df)[, as.list(acf.fft(Area)) , ID]
#   ID V1 V2
#1:  1  1 -1
#2:  2  1 -1
#3:  3  1 -1
#4:  4  1 -1 
#5:  5  1 -1
#6:  6  1 -1
#7:  7  1 -1
#8:  8  1 -1