我有一个R语言中的 Dataframe 列表,在这个列表中,每个 Dataframe 都是一个“对”的一部分,你可以分辨出哪两个 Dataframe 在一起,因为这两个 Dataframe 的名字有相同的前缀(例如,“001”),但它们具有不同的后缀除了标识符变量(xlm3nlx)之外, Dataframe 内的所有数据都是数字(xlm0nlx,xlmlnlx,xlm2nlx)。
set.seed(12345)
library(dplyr)
# randomly generate a list of dataframes
# that looks like my real life data
id_vars <- gl(n = 30, k = 2) %>% sprintf("%03d", .)
mystrings <- rep.int(x = c("_AB", "_CD", "_EF", "_GH", "_IJ"), 60/5)
df_names <- paste0(id_vars, mystrings)
the_problem <- replicate(60, {
data.frame(col1 = as.numeric(sample(1:5, 10, replace = TRUE)),
col2 = as.numeric(sample(1:5, 10, replace = TRUE)),
col3 = as.numeric(sample(1:5, 10, replace = TRUE))
)
}, simplify = FALSE)
names(the_problem) <- df_names
我想对每一对 Dataframe 进行算术平均。一旦两个 Dataframe 被平均在一起,后缀中包含的信息就不再重要了,所以我不想在最终产品中包含这些信息。我还希望最终产品是一个 Dataframe 列表,而不是一个大的 Dataframe 。
# how I'd like the final product to be structured
the_solution <- replicate(30, {
data.frame(col1 = as.numeric(sample(1:5, 10, replace = TRUE)),
col2 = as.numeric(sample(1:5, 10, replace = TRUE)),
col3 = as.numeric(sample(1:5, 10, replace = TRUE))
)
}, simplify = FALSE)
new_id <- gl(n = 30, k = 1) %>% sprintf("%03d", .)
the_solution <- mapply(cbind, the_solution, "idvar" = new_id, SIMPLIFY = FALSE)
names(the_solution) <- new_id
我发现this prior SO question有一个类似的问题,涉及 Dataframe 共享前缀,但是当我有30多个唯一前缀时,解决方案就不太好了。有没有一种方法可以在不提及每个唯一前缀的情况下实现这个目标?
4条答案
按热度按时间z5btuh9x1#
您可以按前缀对 Dataframe 列表进行分组,并使用
reduce
计算均值:输出
或者,您可以将所有内容折叠到一个大数据框架中,执行操作,然后将其拆分:
cig3rfwq2#
类似这样的东西应该可以工作:
k97glaaz3#
定义一个
Mean
函数和一个prefix
向量,然后使用tapply
。不使用任何包。如果我们知道总是有2个对象需要平均,我们可以将
Mean
定义为以下之一:rggaifut4#
data.table
解决方案:可以扩展到多个平均列(通过更改
avg_cols
),不同的函数(通过更改lapply(.SD)
中的函数)和不同的id结构(通过修改正则表达式)