【问题标题】:Addressing another dataframe with dynamic variables in R (ideally dplyr, using mutate)在 R 中使用动态变量处理另一个数据帧(理想情况下是 dplyr,使用 mutate)
【发布时间】:2021-08-08 20:05:26
【问题描述】:

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

我有两个数据框。

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 数据框中创建另一列“平均值”,它为我提供了 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))))```.

【问题讨论】:

    标签: r dynamic dplyr


    【解决方案1】:

    这里是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
    

    【讨论】:

    • 真的很喜欢这种做法!您知道如何在您的第一个建议解决方案中将 na.rm=TRUE 参数赋予均值函数吗?
    • 是的!您可以将list(mean) 替换为~mean(.x, na.rm = TRUE)。可能一开始就应该这样做。更新了我的答案!
    【解决方案2】:

    这能解决您的问题吗?

    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))))
    

    【讨论】:

    • 非常感谢,它做到了!理想情况下,我想知道如何使用 ref 数据框的名称(就像我的尝试一样),但我真的很高兴我现在有了一些有用的东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2018-05-06
    相关资源
    最近更新 更多