我有一个包含不同长度的不同时间序列的数据帧列表。我想总结一个变量的计数,然后根据该特定数据集中包含的数据年数对其进行标准化。
所以使用示例数据框:
data_list <- list(data.frame(temp_bin = rep(1:4, 2:5), value = runif(14)),
data.frame(temp_bin = rep(1:4, 3:6), value = runif(18)),
data.frame(temp_bin = rep(1:4, 4:7), value = runif(22)))
# this might be ~10 different data sets with ~ 100k observations each
count <- lapply(data_list, function(x) {nrow(x)/5} )
# for real data this would be divided by 8760 for the # of hours in a year.
这大概是我想要做的,但是n()/ count不起作用,因为count是一个列表。
data_bin <- data_list %>%
lapply(., group_by, temp_bin) %>%
lapply(., summarise, n = n()/count)
我尝试在n的定义中做一个lapply或mapply,但这似乎没有用。还尝试分两步进行 - 创建获取原始n值,然后在下一步中使用mapply进行划分,但这也不起作用。
答案 0 :(得分:2)
如果你将count
步骤放在data_bin
步骤中,我认为它可以完成你想要的任务,虽然我对你的意思有点模糊,但我觉得这很有效:(注意你可以从.
的第一个参数中移除lapply
作业,这是[{1}}的默认行为)
%>%
这是你想要的吗?您只需返回data_bin <- data_list %>%
lapply(group_by, temp_bin) %>%
# We need x so I put summarize in a manual function
lapply(function(x){summarize(x,n = 5*n()/nrow(x))}) # move the 5 to numerator
data_bin[[1]]
Source: local data frame [4 x 2]
temp_bin n
1 1 0.7142857
2 2 1.0714286
3 3 1.4285714
4 4 1.7857143
结果,即可仔细检查摘要是否正在执行您想要的操作。
nrow(x)
答案 1 :(得分:1)
我会尽量避免在lapply
语句的每一行使用dplyr
。您可以在函数中包含单个data.frame
转换,然后将lapply
函数包装到data_list
library(dplyr)
ret_db <- function(df) {
db <- df %>%
group_by(.,temp_bin) %>%
summarise(.,n=n()/(nrow(df)/5))
return(db)
}
data_bin <- lapply(data_list,ret_db)