【问题标题】:mutate column based on grepl string match基于 grepl 字符串匹配的变异列
【发布时间】:2021-03-10 15:26:39
【问题描述】:

我希望根据部分字符串匹配来改变一列,我试过了:

df = data.frame(aa = 1:10, bb = NA, cc = 5)

df %>%
  mutate(c = ifelse(is.na(bb), grepl('a', names(.)), cc))

但是我正在寻找这样的东西:

## if bb is na return values in aa

 aa bb cc  c
1   1 NA  5  1
2   2 NA  5  2
3   3 NA  5  3
4   4 NA  5  4
5   5 NA  5  5
6   6 NA  5  6
7   7 NA  5  7
8   8 NA  5  8
9   9 NA  5  9
10 10 NA  5 10

上面没有返回。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    使用“。”引用数据框并在数据框中使用 grepl 将匹配列作为解决方案..

      df %>% 
          mutate(c = ifelse(is.na(bb),.[,grepl('a',names(.))],cc))
    

    您的代码是正确的,只是它标识了一个列名,但没有引用与 `ifelse(.,.,.) 所需的 is.na(bb) 相同长度的列向量。在 R 中,至少就控制台而言,“名称”一词有两种含义。一些两侧有两个引号的文本是一个字符值,数据框的“名称”(更具体地说是列名)也是存储在属性中的字符值。但是 R 工作区也有一个“名称”集合(更具体地说是对象名称),获取它们的值的典型方法是在控制台中输入它们的 R 名称​​unquoted。

    【讨论】:

      【解决方案2】:

      由于您使用dplyr,您也可以使用dplyr::select 来选择列,有很多函数可以帮助选择列。它返回一个数据帧,因为我们需要ifelse 中的向量,所以我们使用pull。

      library(dplyr)
      
      df %>%
        mutate(c = ifelse(is.na(bb), select(., matches('a')) %>% pull, cc))
      
      #   aa bb cc  c
      #1   1 NA  5  1
      #2   2 NA  5  2
      #3   3 NA  5  3
      #4   4 NA  5  4
      #5   5 NA  5  5
      #6   6 NA  5  6
      #7   7 NA  5  7
      #8   8 NA  5  8
      #9   9 NA  5  9
      #10 10 NA  5 10
      

      【讨论】:

        猜你喜欢
        • 2018-12-12
        • 2018-12-17
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-19
        • 1970-01-01
        相关资源
        最近更新 更多