我在这种情况下遇到了问题:
我有三个数据框,就像这样:
df1 = data.frame(A = c(1,2,2),
B = c(5,4,3))
df2 = data.frame(C = c(1,2,2),
D = c(5,4,3))
df3 = data.frame(E = c(1,2,2),
'F' = c(5,4,3))
我想使用我创建的变量列表将它们传递给循环:
df_names <- paste0("df", 1:3)
df_all <- mget(var_names, envir = globalenv())
但是列名称不同,这意味着我无法获取第一列和第二列的平均值!
我需要的是这样的:
for(i in 1:3){
df_mean[i] <- df_all[[i]] %>%
mutate(mean_first_column = mean (A (or C or E)),
mean_second_column = mean(B, D or F))
}
谢谢!
最佳答案
考虑使用colMeans
或across
library(dplyr)
df_mean <- vector('list', length(df_all))
for(i in seq_along(df_all))
df_mean[[i]] <- df_all[[i]] %>%
summarise(across(everything(), mean))
-输出
df_mean
[[1]]
A B
1 1.666667 4
[[2]]
C D
1 1.666667 4
[[3]]
E F
1 1.666667 4
如果我们需要指定位置,则可以使用 .
或 cur_data()
或 .data
的子集(使用分组属性, cur_data()
或 .data
应该更合适
df_mean <- vector('list', length(df_all))
for(i in seq_along(df_all))
df_mean[[i]] <- df_all[[i]] %>%
mutate(mean_first_column = mean(cur_data()[[1]]),
mean_second_column = mean(cur_data()[[2]]))
-输出
df_mean
[[1]]
A B mean_first_column mean_second_column
1 1 5 1.666667 4
2 2 4 1.666667 4
3 2 3 1.666667 4
[[2]]
C D mean_first_column mean_second_column
1 1 5 1.666667 4
2 2 4 1.666667 4
3 2 3 1.666667 4
[[3]]
E F mean_first_column mean_second_column
1 1 5 1.666667 4
2 2 4 1.666667 4
3 2 3 1.666667 4
注意:mutate
返回整个数据以及创建的列。由于 mean
是单个值,因此使用 summarise
在base R
中,我们可以使用lapply
循环遍历list
并应用colMeans
lapply(df_all, colMeans)
或者如果我们想使用 tidyverse
语法`
library(purrr)
map(df_all, ~ .x %>%
summarise(across(everything(), mean))
关于r - 如何引用循环 R 中列的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68186214/