r 删除列中的关键字

r remove keywords in a column

我的数据框中有一列包含这样的词。

ColA
2-4 Model
Group1
Group ACH
Group2
Phenols
Group1
Group ACH
Group2
MONO MHPP
Group1
Group ACH
Group2

我想像这样创建两个额外的列:1) 没有关键字 c("Group1", "Group (ACH)", "Group2") 和 2) 第二个列只保留那些词袋。

ColA          ColB        ColC
2-4 Model     2-4 Model   
Group1                    Group1
Group (ACH)               Group (ACH) 
Group2                    Group2
Phenols      Phenols 
Group1                    Group1
Group (ACH)               Group (ACH)
Group2                    Group2
MONO MHPP    MONO MHPP
Group1                    Group1
Group (ACH)               Group (ACH)
Group2                    Group2  

我尝试了 gsubstr_replace 但没有结果。所以非常感谢任何建议。

您可以使用 ifelse -

val <- c('Group1', 'Group ACH', 'Group2')
df <- transform(df, ColB = ifelse(ColA %in% val, '', ColA), 
                    ColC = ifelse(ColA %in% val, ColA, ''))
df

#        ColA      ColB      ColC
#1  2-4 Model 2-4 Model          
#2     Group1              Group1
#3  Group ACH           Group ACH
#4     Group2              Group2
#5    Phenols   Phenols          
#6     Group1              Group1
#7  Group ACH           Group ACH
#8     Group2              Group2
#9  MONO MHPP MONO MHPP          
#10    Group1              Group1
#11 Group ACH           Group ACH
#12    Group2              Group2

如果一般来说,您想检查所有 "Group" 值,您可以使用 grepl 而不是在 val 中提及所有值。

df <- transform(df, ColB = ifelse(grepl('Group', ColA), '', ColA), 
                    ColC = ifelse(grepl('Group', ColA), ColA, ''))

这是另一个使用 tidyverse 的选项。首先,我使用 str_remove 创建一个新列 (ColB) 以删除任何关键字。然后,我使用 str_extract_all 仅提取关键字以创建另一个新列 (ColC)。

library(tidyverse)

val <- c('Group1', 'Group ACH', 'Group2')

df %>%
  mutate(ColB = str_remove(ColA, paste(val, collapse = "|")),
         ColC = str_extract_all(ColA, paste(val, collapse = "|")))

输出

        ColA      ColB      ColC
1  2-4 Model 2-4 Model          
2     Group1              Group1
3  Group ACH           Group ACH
4     Group2              Group2
5    Phenols   Phenols          
6     Group1              Group1
7  Group ACH           Group ACH
8     Group2              Group2
9  MONO MHPP MONO MHPP          
10    Group1              Group1
11 Group ACH           Group ACH
12    Group2              Group2

这是另一种方法: 这是可能的,因为您的数据具有清晰的模式:

工作原理:

  1. 创建每组 4 行的组
  2. 然后将 dyplrbase R 子集结合起来,为每一列你需要什么(在你的情况下 ColB 总是每组的第一个, ColC 是行 2:4 每组:
library(dplyr)  
df %>% 
  group_by(group = rep(row_number(), each=4, length.out = n())) %>% 
  mutate(ColB = c(ColA[1], rep(NA, 3)), ColC= c(NA, ColA[2:4]))
   ColA      group ColB      ColC     
   <chr>     <int> <chr>     <chr>    
 1 2-4 Model     1 2-4 Model NA       
 2 Group1        1 NA        Group1   
 3 Group ACH     1 NA        Group ACH
 4 Group2        1 NA        Group2   
 5 Phenols       2 Phenols   NA       
 6 Group1        2 NA        Group1   
 7 Group ACH     2 NA        Group ACH
 8 Group2        2 NA        Group2   
 9 MONO MHPP     3 MONO MHPP NA       
10 Group1        3 NA        Group1   
11 Group ACH     3 NA        Group ACH
12 Group2        3 NA        Group2