使用magrittr和lapply按列表中的每个df中的列分隔值

时间:2015-05-21 19:48:19

标签: r lapply magrittr

我有一个包含不同长度的不同时间序列的数据帧列表。我想总结一个变量的计数,然后根据该特定数据集中包含的数据年数对其进行标准化。

所以使用示例数据框:

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进行划分,但这也不起作用。

2 个答案:

答案 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)