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
我尝试了 gsub
和 str_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
这是另一种方法:
这是可能的,因为您的数据具有清晰的模式:
工作原理:
- 创建每组 4 行的组
- 然后将
dyplr
与 base 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
我的数据框中有一列包含这样的词。
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
我尝试了 gsub
和 str_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
这是另一种方法: 这是可能的,因为您的数据具有清晰的模式:
工作原理:
- 创建每组 4 行的组
- 然后将
dyplr
与base 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