我将一个函数应用于这样的数据框
> 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))
答案 0 :(得分:1)
执行此操作的一种方法是使用dplyr
和tidyr
包,如下所示,
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,那么您可以split
,apply
和rbind
,即
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