在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