【问题标题】:How to add a column after the last column containing a certain string?如何在包含某个字符串的最后一列之后添加一列?
【发布时间】:2020-04-21 18:03:40
【问题描述】:

我有一个这样的数据集

df <- data.frame(abc_1 = 1:10, abc_2 = 11:20, abc_3 = 21:30, somevar = 31:40)
head(df)
   abc_1 abc_2 abc_3 somevar
1      1    11    21      31
2      2    12    22      32
3      3    13    23      33
4      4    14    24      34
5      5    15    25      35
6      6    16    26      36

我想在 abc_3 之后插入一个新列(在我的例子中是 abc_1、abc_2、abc_3 的行总和)。由于(a)数据集很大,(b)我可能决定在添加列之前操纵数据集(即弄乱列索引),并且因为(c)我想对包含一些不同的变量执行此操作字符串,我希望使用一种不引用列索引而是匹配字符串 abc 的方式来执行此操作。

我在 tibble 包中找到了 add_column,但它只允许像这样按索引添加列

library(tibble)
add_column(df, abc_sum = rowSum(abc_1, abc_2, abc_3), .after = 3)

我想要的是这样的:

   abc_1 abc_2 abc_3 abc_sum somevar
1      1    11    21      33      31
2      2    12    22      36      32
3      3    13    23      39      33
4      4    14    24      42      34
5      5    15    25      45      35
6      6    16    26      48      36

我希望通过匹配字符串 abc_3 将 .after = 3 替换为在 abc_3 之后插入它的表达式。

【问题讨论】:

  • 如果您可以添加an example output,这可能会导致获得结果的机会更高(并且更快)。

标签: r regex dplyr


【解决方案1】:

你可以这样做:

add_column(df, 
           abc_sum = rowSums(df[startsWith(names(df), "abc")]),
           .after = "abc_3")

   abc_1 abc_2 abc_3 abc_sum somevar
1      1    11    21      33      31
2      2    12    22      36      32
3      3    13    23      39      33
4      4    14    24      42      34
5      5    15    25      45      35
6      6    16    26      48      36
7      7    17    27      51      37
8      8    18    28      54      38
9      9    19    29      57      39
10    10    20    30      60      40

【讨论】:

    【解决方案2】:

    我们可以使用reduce

    library(dplyr)
    library(purrr)
    df %>% 
        mutate(abc_sum = select(., starts_with('abc')) %>%
            reduce(`+`)) %>%
        select(starts_with('abc'), everything())
    #   abc_1 abc_2 abc_3 abc_sum somevar
    #1      1    11    21      33      31
    #2      2    12    22      36      32
    #3      3    13    23      39      33
    #4      4    14    24      42      34
    #5      5    15    25      45      35
    #6      6    16    26      48      36
    #7      7    17    27      51      37
    #8      8    18    28      54      38
    #9      9    19    29      57      39
    #10    10    20    30      60      40
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 2018-06-02
      • 2022-11-25
      相关资源
      最近更新 更多