在r中用数据帧中的模式替换元素

在r中用数据帧中的模式替换元素,r,R,我有一个数据帧类似于: df1 = read.table(text="name element m20895 P540554 m20897 S01367 m20907 P540554,P209332 m20914 S01367,S01247 m20915 S01247 m20925 S00897 m26943 P540554,P209332 m26944 S00897,S00898,S00899,S00900", h

我有一个数据帧类似于:

df1 = read.table(text="name element
    m20895  P540554
    m20897  S01367
    m20907  P540554,P209332
    m20914  S01367,S01247
    m20915  S01247
    m20925  S00897
    m26943  P540554,P209332
    m26944  S00897,S00898,S00899,S00900", header=T, stringsAsFactors=F)
我想用数据帧(df2)的“B”列中的相应值替换以“s”开头的任何元素

因此,预期的结果是:

    result = read.table(text="name  element
    m20895  P540554
    m20897  P00432
    m20907  P540554,P209332
    m20914  P00432,P00433
    m20915  P00433
    m20925  P00434
    m26943  P540554,P209332
    m26944  P00434,P00435,P00436,P00437", header=T, stringsAsFactors=F)

首先需要将
元素
列按
拆分,

element_split <- strsplit(df1$element, ",")
然后,您可以使用
折叠元素以获得新列(或将其保留为列表以便于使用):


df1$new\u element您首先需要将
元素
列按
拆分:

element_split <- strsplit(df1$element, ",")
然后,您可以使用
折叠元素以获得新列(或将其保留为列表以便于使用):


df1$new\u element您也可以试试这个

library(tidyverse)
df1 %>% 
  separate_rows(element) %>% 
  left_join(df2, by=c("element" = "A")) %>% 
  mutate(element = ifelse(is.na(B), element, B)) %>% 
  group_by(name) %>% 
  summarise(element= paste(element, collapse = ","))  
# A tibble: 8 x 2
  name   element                    
  <chr>  <chr>                      
1 m20895 P540554                    
2 m20897 P00432                     
3 m20907 P540554,P209332            
4 m20914 P00432,P00433              
5 m20915 P00433                     
6 m20925 P00434                     
7 m26943 P540554,P209332            
8 m26944 P00434,P00435,P00436,P00437
库(tidyverse)
df1%>%
单独的_行(元素)%>%
左联合(df2,由=c(“元素”=“A”))%>%
突变(元素=ifelse(is.na(B),元素,B))%>%
分组单位(名称)%>%
摘要(元素=粘贴(元素,折叠=“,”))
#一个tibble:8x2
名称元素
1 m20895 P540554
2 m20897 P00432
3 m20907 P540554,P209332
4 m20914 P00432、P00433
5 m20915 P00433
6 m20925 P00434
7 m26943 P540554,P209332
8 m26944 P00434、P00435、P00436、P00437

您也可以试试这个

library(tidyverse)
df1 %>% 
  separate_rows(element) %>% 
  left_join(df2, by=c("element" = "A")) %>% 
  mutate(element = ifelse(is.na(B), element, B)) %>% 
  group_by(name) %>% 
  summarise(element= paste(element, collapse = ","))  
# A tibble: 8 x 2
  name   element                    
  <chr>  <chr>                      
1 m20895 P540554                    
2 m20897 P00432                     
3 m20907 P540554,P209332            
4 m20914 P00432,P00433              
5 m20915 P00433                     
6 m20925 P00434                     
7 m26943 P540554,P209332            
8 m26944 P00434,P00435,P00436,P00437
库(tidyverse)
df1%>%
单独的_行(元素)%>%
左联合(df2,由=c(“元素”=“A”))%>%
突变(元素=ifelse(is.na(B),元素,B))%>%
分组单位(名称)%>%
摘要(元素=粘贴(元素,折叠=“,”))
#一个tibble:8x2
名称元素
1 m20895 P540554
2 m20897 P00432
3 m20907 P540554,P209332
4 m20914 P00432、P00433
5 m20915 P00433
6 m20925 P00434
7 m26943 P540554,P209332
8 m26944 P00434、P00435、P00436、P00437

我建议您不要像现在这样以非标准化的CSV格式存储数据。这将使处理数据变得更加困难。我建议您不要像现在这样以非标准化的CSV格式存储数据。这将使处理数据变得更加困难。很好!非常优雅。没有意识到可以在if调用中赋值。df1中列“element”的任何值都是以“P”和“S”开头的元素的混合物。此代码将删除“P”元素。例如,在第4行中,假设值为“P01367,S01247”。它只给出了一个替换的元素。@user3354212的确,小错误(它丢失了返回整个x元素),我已经修复了它,你能确认它现在能按预期工作吗?@iod你可以在任何你想分配的地方;-)美好的非常优雅。没有意识到可以在if调用中赋值。df1中列“element”的任何值都是以“P”和“S”开头的元素的混合物。此代码将删除“P”元素。例如,在第4行中,假设值为“P01367,S01247”。它只给出了一个替换的元素。@user3354212的确,小错误(它丢失了返回整个x元素),我已经修复了它,你能确认它现在能按预期工作吗?@iod你可以在任何你想分配的地方;-)哦!我刚学到一个新东西!不知道分开的行。我笨拙的变通方法是没有必要的!没有贡献任何你没有做得更好的东西。哦!我刚学到一个新东西!不知道分开的行。我笨拙的变通方法是没有必要的!没有真正贡献任何你没有做得更好的东西。
df1$element <- sapply(l_element_B, paste, collapse=",")
df1$new_element <- sapply(l_element_B, paste, collapse=",")
library(tidyverse)
df1 %>% 
  separate_rows(element) %>% 
  left_join(df2, by=c("element" = "A")) %>% 
  mutate(element = ifelse(is.na(B), element, B)) %>% 
  group_by(name) %>% 
  summarise(element= paste(element, collapse = ","))  
# A tibble: 8 x 2
  name   element                    
  <chr>  <chr>                      
1 m20895 P540554                    
2 m20897 P00432                     
3 m20907 P540554,P209332            
4 m20914 P00432,P00433              
5 m20915 P00433                     
6 m20925 P00434                     
7 m26943 P540554,P209332            
8 m26944 P00434,P00435,P00436,P00437