我的数据栏里有这样的字。
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
,但没有结果。所以任何建议都是非常感谢的。
发布于 2022-01-08 06:18:37
你可以用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, ''))
发布于 2022-01-08 06:30:43
下面是使用tidyverse
的另一个选项。首先,我创建一个新列(ColB
),使用str_remove
删除任何关键字。然后,我使用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
发布于 2022-01-08 10:12:04
以下是另一种方法:这是可能的,因为您的数据有一个清晰的模式:
它的工作原理:
dyplr
和base R
子集(在您的示例中,ColB
总是每个组中的第一个,ColC
在每个组中为第2行: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
https://stackoverflow.com/questions/70629997
复制相似问题