在 R 中使用动态变量寻址另一个数据帧(理想情况下是 dplyr,使用 mutate)

Addressing another dataframe with dynamic variables in R (ideally dplyr, using mutate)

我已经阅读了各种关于动态命名变量的帖子,但我找不到答案。

我有两个数据框。

df <- data.frame(qno=c(1,2,3,4))
ref <- data.frame(Q1 = c(1:20),Q2 = c(21:40),Q3=c(41:60),Q4 = c(61:80))

现在我想在 df 数据框中创建另一列 'average',它给出了 ref 中每列的平均值。 预期输出:

df <- data.frame(qno=c(1,2,3,4), average = c(10.5,30.5,50.5,70.5))

这是我尝试过的:

df <- df %>% 
  mutate(average := mean(!!as.name(paste0("ref$Q",qno)))

我也试过带 for 循环的版本,但也没用。

for (i in 1:length(df$qno)){
  df$average[i] <- mean(as.name(paste0("ref$Q",df$qno[i])))
}
df <- df %>% 
  mutate(average = mean(as.name(paste0("ref$Q",qno))))```.

这是否解决了您的问题?

ref <- data.frame(Q1 = c(1:20),Q2 = c(21:40),Q3=c(41:60),Q4 = c(61:80))
out <- data.frame(qno=c(1,2,3,4), average = c(10.5,30.5,50.5,70.5))    

df <- data.frame(qno=c(1:length(ref)))
    
for (i in seq_along(ref)) {
  df$average[i] <- mean(ref[[i]], na.rm = T)
  
}

我不太确定你是否想像变量一样命名行,所以你可以在创建 df 对象时添加它:

df <- data.frame(qno = paste0("Q", c(1:length(ref))))

这是 mutate:

df %>% mutate(average = t(ref %>% summarise(across(everything(),  ~mean(.x, na.rm = TRUE)))))

  qno average
1   1    10.5
2   2    30.5
3   3    50.5
4   4    70.5

但是如果您想要 ref:

中的名称,则完全可以在不使用 mutate 的情况下使用它
t(ref %>% summarise(across(everything(), list(mean), .names = "{.col}"))) %>%
  data.frame() %>% 
  rename(average = 1)

   average
Q1    10.5
Q2    30.5
Q3    50.5
Q4    70.5