基于Tidyverse中另一列的行元素替换列中的行元素

时间:2019-07-15 01:26:13

标签: r tidyverse

嗨,这是我在堆栈溢出中的第一篇文章,如果格式不正确以及是否曾被要求过,我深表歉意-我无法找到解决方案。

我正在尝试根据另一列中的某些条件替换某列中的某些字符串。我有以下数据框:

> 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

2 个答案:

答案 0 :(得分:1)

这是tidyverse的一种方式-

df %>% 
  mutate(
    Group1 = case_when(
      str_detect(Group3, "IOT") ~ "IOT",
      str_detect(Group3, "M2M") ~ "M2M",
      TRUE ~ Group1
    )
  )

您还可以使用ifelsegrepl在基数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]
    }
}

希望有帮助,我很乐意回答任何其他问题或提供说明!