嗨,这是我在堆栈溢出中的第一篇文章,如果格式不正确以及是否曾被要求过,我深表歉意-我无法找到解决方案。
我正在尝试根据另一列中的某些条件替换某列中的某些字符串。我有以下数据框:
> df
# A tibble: 14 x 3
Group1 Group2 Group3
<chr> <chr> <chr>
1 MOBILES MOBILES - CORE IOT
2 MOBILES MOBILES - CORE IOT_Vas
3 MOBILES MOBILES - CORE IOT_Vas
4 Data & IP Data & IP IP WAN
5 Data & IP Data & IP Internet Solutions
6 Data & IP Data & IP Internet Solutions
7 MOBILES IOT M2M
8 MOBILES IOT M2M
9 MOBILES IOT M2M VAS
10 MOBILES IOT M2M VAS
11 Cloud Services Cloud Services Professional Services
12 Cloud Services Cloud Services Professional Services
13 Mobiles MOBILES - CORE MOBILES - CORE
14 Mobiles MOBILES - Voice MOBILES - Voice
我要实现的目标是,如果“组3”包含字符串IOT,则“组1”中的值= IOT,如果“组3”包含M2M,则值“组1” = M2M。否则,组1中的值将保持不变。
我对堆栈溢出和R tidyverserse还是比较陌生,但是我一直无法找到解决我问题的方法。香港专业教育学院尝试过str_replace和mutate_at,但还无法弄清楚当我基于2个不同的元素进行即时通讯替换时如何做到这一点。
结果数据框应如下所示:
> df
# A tibble: 14 x 3
Group1 Group2 Group3
<chr> <chr> <chr>
1 IOT MOBILES - CORE IOT
2 IOT MOBILES - CORE IOT
3 IOT MOBILES - CORE IOT_Vas
4 Data & IP Data & IP IP WAN
5 Data & IP Data & IP Internet Solutions
6 Data & IP Data & IP Internet Solutions
7 M2M IOT M2M
8 M2M IOT M2M
9 M2M IOT M2M VAS
10 M2M IOT M2M VAS
11 Cloud Services Cloud Services Professional Services
12 Cloud Services Cloud Services Professional Services
13 Mobiles MOBILES - CORE MOBILES - CORE
14 Mobiles MOBILES - Voice MOBILES - Voice
答案 0 :(得分:1)
这是tidyverse
的一种方式-
df %>%
mutate(
Group1 = case_when(
str_detect(Group3, "IOT") ~ "IOT",
str_detect(Group3, "M2M") ~ "M2M",
TRUE ~ Group1
)
)
您还可以使用ifelse
和grepl
在基数R中执行此操作-
df$Group1 <- ifelse(grepl("IOT", df$Group3), "IOT",
ifelse(grepl("M2M", df$Group3), "M2M", df$Group1)
)
答案 1 :(得分:0)
我尝试通过创建group1
在此处复制您的数据帧,该数据将根据group3
的值进行更改。我创建了一个for循环,如果在group3中检测到其中两个字符串中的任何一个,则将group1
更改为“ M2M”或“ IOT”,但是如果找不到任何字符串,则group1
的值将保持不变。>
df <- data.frame(group1 = c("TEST", "TEST", "TEST", "TEST", "TEST"),
group3 = c("M2M", "DATA AND IP", "IOT", "M2M VAS", "IOT MORETEXT"),
stringsAsFactors = FALSE)
# loop through rows in df
for (i in 1:nrow(df)) {
# is the string "M2M" in group3?
if (str_detect(df$group3[i], "M2M")) {
# if so reassign group1 to M2M
df$group1[i] <- "M2M"
# use the same logic, but with the string "IOT"
} else if (str_detect(df$group3[i], "IOT")) {
df$group1[i] <- "IOT"
} else {
# otherwise keep group1 the same
df$group1[i] <- df$group1[i]
}
}
希望有帮助,我很乐意回答任何其他问题或提供说明!