使用 magrittr 和 lapply 将列表中每个 df 中的列除以值列表

Using magrittr and lapply to divide a column in each df in a list by a list of values

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

因此使用示例数据框:

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 进行除法,但这也没有用。

如果你把 count 步骤放在你的 data_bin 步骤中,我认为它可以完成你想要的,虽然我对你的意思有点模糊,但我认为这是可行的:(注意您可以从 lapply 的第一个参数中删除 . 赋值,这是 %>%)

的默认行为
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) 结果来仔细检查摘要部分是否正在执行您想要的操作。

data_bin <- data_list %>%
 lapply(group_by, temp_bin) %>%
 lapply(function(x){summarize(x,n = nrow(x))}) 

data_bin[[1]]
Source: local data frame [4 x 2]

temp_bin  n
1        1 14
2        2 14
3        3 14
4        4 14

我会尽量避免在 dplyr 语句的每一行上使用 lapply。您可以将单个 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)