使用 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)
我有一个包含不同长度的不同时间序列的数据帧列表。我想总结一个变量的计数,然后根据该特定数据集中包含的数据年数对其进行归一化。
因此使用示例数据框:
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)