【问题标题】:Applying mutate across columns called using paste in R在 R 中使用 paste 跨列应用变异
【发布时间】:2021-04-14 18:19:37
【问题描述】:

我想在 dplyr 中使用 mutate 跨数据框中的列应用一个函数。我想使用粘贴来引用列。

这里是示例数据,但实际数据集有很多列,使粘贴功能成为关键:

data <- data.frame(var1 = c(1:4), var2 = (5:8))
data
  var1 var2
1    1    5
2    2    6
3    3    7
4    4    8

当不带引号单独调用列时,我可以正常工作:

data <- data %>%
  rowwise() %>%
  mutate(
    total = sum(var1,var2)
  )
data
# A tibble: 4 x 3
# Rowwise: 
   var1  var2 total
  <int> <int> <int>
1     1     5     6
2     2     6     8
3     3     7    10
4     4     8    12

但是,我希望能够使用粘贴来调用列:

data <- data %>%
  rowwise() %>%
  mutate(
    total = sum(paste("var",c(1:2),sep=""))
  )

这会返回这个错误:

Error: Problem with `mutate()` input `total`.
x invalid 'type' (character) of argument
ℹ Input `total` is `sum(paste("var", c(1:2), sep = ""))`.
ℹ The error occurred in row 1.
Run `rlang::last_error()` to see where the error occurred.

【问题讨论】:

    标签: r


    【解决方案1】:

    在这里,我们不需要rowwise,因为rowSums 会更高效

    library(dplyr)
    data %>% 
         mutate(total = rowSums(.))
    

    或者对于列的子集(使用paste),我们select它们并使用rowSums

    data %>% 
        mutate(total = select(., paste0('var', 1:2)) %>% 
                  rowSums)
    

    如果我们需要使用列名,选择c_across内的数据集列,得到sum(在rowwise之后)

    data %>%
       rowwise %>%
       mutate(total = sum(c_across(c(var1, var2)))) %>%
       ungroup
    

    或者使用paste选择c_across中的列

    data %>%
       rowwise %>%
       mutate(total = sum(c_across(paste0('var', 1:2)))) %>%
       ungroup
    # A tibble: 4 x 3
    #  var1  var2 total
    #  <int> <int> <int>
    #1     1     5     6
    #2     2     6     8
    #3     3     7    10
    #4     4     8    12
    

    或者使用cur_data()提取选定的列([

    data %>%
       rowwise %>%
       mutate(totall = sum(cur_data()[paste0('var', 1:2)])) %>%
       ungroup
    # A tibble: 4 x 3
    #   var1  var2 totall
    #  <int> <int>  <int>
    #1     1     5      6
    #2     2     6      8
    #3     3     7     10
    #4     4     8     12
    

    【讨论】:

    • 太棒了,谢谢阿克伦!我应该在撞到我的头一个小时之前问一下。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多