【问题标题】:replace one column with another using regex matching in R使用 R 中的正则表达式匹配将一列替换为另一列
【发布时间】:2022-01-27 05:58:37
【问题描述】:

我正在处理一些调查数据,我想用另一个调查项目替换一个调查项目/列的内容,同时保留原始单元格内容。 Ex - 如果 Q2_1.x 缺失,将 Q2_1.x 替换为 Q2_1.y。

这是我的数据示例:

org_dat <- read_table(\'ID   Q2_1.x  Q2_2.x  Q2_1.y  Q2_2.y  Q14_1.x Q14_1.y Q15
1   Yes NA  NA  NA  Sometimes   NA  NA
2   -99 NA  No  NA  NA  Always  Yes
3   NA  NA  NA  NA  NA  NA  NA
4   NA  NA  NA  No  NA  NA  No 
5   NA  NA  NA  NA  NA  Always  NA
6   NA  NA  NA  No  NA  NA  NA\') %>% mutate_all(as.character)

这是我想要的输出:

dat_out <- read_table(\'ID   Q2_1    Q2_2    Q14_1   Q15
1   Yes NA  Sometimes   NA
2   No  NA  Always  Yes
3   NA  NA  NA  NA
4   NA  No  NA  No
5   NA  NA  Always  NA
6   NA  No  NA  NA\')

当前解决方案我知道我可以单独替换这些列中的每一个,但是我有很多列要处理,我想使用一种智能的 dplyr/grepl 方法来解决这个问题!有任何想法吗?我总是用 Q*.y 替换 Q*.x。

org_dat %>% mutate(Q2_1.x = case_when(is.na(Q2_1.x) ~ Q2_1.y,
                                TRUE ~ Q2_1.x)) %>% 
       mutate(Q2_2.x = case_when(is.na(Q2_2.x) ~ Q2_2.y,
                                TRUE ~ Q2_2.x)) %>%
  mutate(Q14_1.x = case_when(is.na(Q14_1.x) ~ Q14_1.y,
                            TRUE ~ Q14_1.x)) %>%
  rename(Q2_1 = Q2_1.x,
         Q2_2 = Q2_2.x,
         Q14_1 = Q14_1.x) %>%
  select(-matches(\"x|y\"))

    标签: r dplyr grepl


    【解决方案1】:

    这是acrosscoalesce的选项,循环acrossends_with'x'的列,将列名(cur_column())中的子字符串从'x'替换为'y' ',get 列值,对循环列执行coalesce,然后从.names 中的列名中删除子字符串

    library(dplyr)
    library(stringr)
    org_dat %>% 
        mutate(across(ends_with("x"),
         ~ coalesce(., get(str_replace(cur_column(), "x", "y"))),
            .names = "{str_remove(.col, '.x')}"), .keep = "unused", .before = 2)
    

    -输出

    # A tibble: 6 × 5
      ID    Q2_1  Q2_2  Q14_1     Q15  
      <chr> <chr> <chr> <chr>     <chr>
    1 1     Yes   <NA>  Sometimes <NA> 
    2 2     No    <NA>  Always    Yes  
    3 3     <NA>  <NA>  <NA>      <NA> 
    4 4     <NA>  No    <NA>      No   
    5 5     <NA>  <NA>  Always    <NA> 
    6 6     <NA>  No    <NA>      <NA> 
    

    【讨论】:

    • 哇——这太优雅了。 coalesce 如何知道只查看那些匹配的列(Q2_1.x 和 Q2_1.y)?
    • @NewBee 循环仅循环 across ".x" 列。在循环内部,列名(cur_column().x变为.yget对应该列的值
    • 泰!还有一种方法可以返回循环未触及的所有列而不显式调用它们(Q15)。我有很多这样的列应该按原样返回..
    • @NewBee 更新了帖子
    • @NewBee 我认为mutate.keep.before 的步骤应该可以解决更新中的问题
    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2020-08-24
    • 2021-04-05
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多