如何仅更换“之前”的零件:&引用;在R中列的每一行中
因此,在数据集中,我有一个名为“干预”的列,每一行如下所示: 第1行:“药物:美罗华|药物:乌托米卢|药物:阿维鲁单抗|药物:PF04518600” 第2行:“生物学:阿来单抗|生物学:供体淋巴细胞|药物:卡莫司汀|药物:阿糖胞苷|药物:足叶乙甙|药物:美法仑|程序:异基因骨髓移植” 我只想提取干预类型,如“药物”、“生物”、“程序”,以保留在列中。甚至更好的是,如果能有独特的干预类型,而不是像第一排那样的“药物”4次 预期输出如下所示: 第1行:“药物” 第2行:“生物、药物、程序”如何仅更换“之前”的零件:&引用;在R中列的每一行中,r,dplyr,tidyverse,R,Dplyr,Tidyverse,因此,在数据集中,我有一个名为“干预”的列,每一行如下所示: 第1行:“药物:美罗华|药物:乌托米卢|药物:阿维鲁单抗|药物:PF04518600” 第2行:“生物学:阿来单抗|生物学:供体淋巴细胞|药物:卡莫司汀|药物:阿糖胞苷|药物:足叶乙甙|药物:美法仑|程序:异基因骨髓移植” 我只想提取干预类型,如“药物”、“生物”、“程序”,以保留在列中。甚至更好的是,如果能有独特的干预类型,而不是像第一排那样的“药物”4次 预期输出如下所示: 第1行:“药物” 第2行:“生物、药物、程序” 我刚刚开
我刚刚开始使用r,我已经安装了tidyverse,并且有点习惯于使用%>%。如果有人能帮我,非常感谢 如果我们只想提取
前面的前缀部分:
library(dplyr)
library(stringr)
library(tidyr)
library(purrr)
df1 %>%
mutate(Interventions = map_chr(str_extract_all(Interventions,
"\\w+(?=:)"), ~ toString(sort(unique(.x)))))
# Interventions
#1 Drug
#2 Biological, Drug, Procedure
或者另一个选项是根据分隔符分隔行,
切片
备用行,并将排序
ed唯一
值粘贴在一起
df1 %>%
mutate(rn = row_number()) %>%
separate_rows(Interventions, sep="[:|]") %>%
group_by(rn) %>%
slice(seq(1, n(), by = 2)) %>%
distinct() %>%
summarise(Interventions = toString(sort(unique(Interventions)))) %>%
ungroup %>%
select(-rn)
# A tibble: 2 x 1
# Interventions
# <chr>
#1 Drug
#2 Biological, Drug, Procedure
df1%>%
变异(rn=行数())%>%
单独的_行(干预,sep=“[:|]”)%>%
分组依据(rn)%>%
切片(seq(1,n(),by=2))%>%
不同的()%>%
总结(干预=toString(排序(唯一(干预)))%>%
解组%>%
选择(-rn)
#一个tibble:2x1
#干预措施
#
#1药物
#2生物、药物、程序
数据
df1不像Akruns那样简洁和相同的逻辑,而是在Base R中:
# Create df:
df1 <- structure(list(Interventions = c("Drug: Rituximab|Drug: Utomilumab|Drug: Avelumab|Drug: PF04518600",
"Biological: alemtuzumab|Biological: donor lymphocytes|Drug: carmustine|Drug: cytarabine|Drug: etoposide|Drug: melphalan|Procedure: allogeneic bone marroow"
)), class = "data.frame", row.names = c(NA, -2L))
# Assign a row id vec:
df1$row_num <- 1:nrow(df1)
# Split string on | delim:
split_up <- strsplit(df1$Interventions, split = "[|]")
# Roll down the dataframe - keep uniques:
rolled_out <- unique(data.frame(row_num = rep(df1$row_num, sapply(split_up, length)),
Interventions = gsub("[:].*","", unlist(split_up))))
# Stack the dataframe:
df2 <- aggregate(Interventions~row_num, rolled_out, paste0, collapse = ", ")
# Drop id vec:
df2 <- within(df2, rm("row_num"))
#创建df:
df1您好,谢谢您的回复,但是,因为这一列中只有两个数据示例,所以干预类型比这三个多。最初,数据集的每一行代表一个独特的临床试验。所以我这里不需要特定药物的名称,只需要干预的类型,我希望它们在同一行中。预期输出为第1行:“药物”;第2行:“生物、药物、程序”。
# Create df:
df1 <- structure(list(Interventions = c("Drug: Rituximab|Drug: Utomilumab|Drug: Avelumab|Drug: PF04518600",
"Biological: alemtuzumab|Biological: donor lymphocytes|Drug: carmustine|Drug: cytarabine|Drug: etoposide|Drug: melphalan|Procedure: allogeneic bone marroow"
)), class = "data.frame", row.names = c(NA, -2L))
# Assign a row id vec:
df1$row_num <- 1:nrow(df1)
# Split string on | delim:
split_up <- strsplit(df1$Interventions, split = "[|]")
# Roll down the dataframe - keep uniques:
rolled_out <- unique(data.frame(row_num = rep(df1$row_num, sapply(split_up, length)),
Interventions = gsub("[:].*","", unlist(split_up))))
# Stack the dataframe:
df2 <- aggregate(Interventions~row_num, rolled_out, paste0, collapse = ", ")
# Drop id vec:
df2 <- within(df2, rm("row_num"))