使用lapply时聚合命名列

时间:2018-04-08 19:53:00

标签: r lapply names

已经有一个类似的问题,答案有所帮助,但在lapply中使用聚合时,我无法将其转换为我的用例。使用setNames,我可以指定一个字符串,但是我很难拔出列名称,lapply目前正在使用setNames。

所以,我有一个df。

head(rms)
  file      date min fullband  band1 band2 band3  band4 band5 hr
1    0 2015/1/14   0   112.17 112.43 94.13 97.92 102.17 96.87  0
2    1 2015/1/14   5   111.73 110.71 94.01 96.78 102.20 96.90  0
3    2 2015/1/14  10   109.08 107.05 91.81 96.68 102.40 97.01  0
4    3 2015/1/14  15   110.74 109.24 93.14 96.65 102.02 96.87  0
5    4 2015/1/14  20   108.82 107.09 93.16 96.50 102.08 96.84  0

我像这样汇总了fullband-band5列:

 rms.byhr<-lapply(rms[-c(1:3,10)], function(x){
aggregate(x, by=list(rms$hr), mean)
})  

但是,lapply自然会使用list name作为列表元素,并用任意的东西(Group.1和x)替换它创建的df的名称。

我试过了:

rms.byhr<-lapply(rms[-c(1:3,10)], function(x){
setNames(aggregate(x, by=list(rms$hr), mean), c("Hour", names(x))
})

rms.byhr<-lapply(rms[-c(1:3,10)], function(x){
setNames(aggregate(x, by=list(rms$hr), mean), c("Hour", names(rms)[which(names(rms)==names(x))]))
})  

但这似乎不起作用并返回NA。所以我想我的问题是,“x”在lapply中是怎样的,如何正确地索引/取出名称?

我需要为后续功能命名。

1 个答案:

答案 0 :(得分:0)

对我来说,完全清楚你想要的输出和格式。如果您想要list,则可以将其打包在unname

rms.byhr<-lapply(rms[-c(1:3,10)], function(x) {
  unname(aggregate(x, by=list(rms$hr), mean))
})  

但是aggregate也可以聚合多个列,这会导致lapply不再需要:

aggregate(. ~ hr, data = rms[-(1:3)], mean)

编辑:我现在看到@Henrik已在评论中回复了您的帖子。我将把这个答案留给后人。