遇到了一些数据纠纷。我试图在书目数据框架中只保留某些作者机构的隶属关系,并用NA取代许多不需要的隶属关系。我需要在多个专栏中这样做,因为论文有多个作者(最多68个(。
可复制代码:
so <- data.frame(inst_1=c("FC1","FC2","Uni1","lab3","lab2"),
inst_2=c("FC1","FC5","college4","laboratory1","lab2"),
inst_3=c("FC2","FC2","University2","lab5","lab5"),
inst_4=c("FC3","FC6","dept2","lab3.2","lab1"),
inst_5=c("FC1","FC2","Uni3","labB","lab5"))
示例数据帧:
inst_1 inst_2 inst_3 inst_4 inst_5
1 FC1 FC1 FC2 FC3 FC1
2 FC2 FC5 FC2 FC6 FC2
3 Uni1 college4 University2 dept2 Uni3
4 lab3 laboratory1 lab5 lab3.2 labB
5 lab2 lab2 lab5 lab1 lab5
我想选择每一个具有前缀"的列;inst";(可能使用str_detect(,并且在那些选择的列中替换任何不包含字符"的机构;FC";使用NA。这是必要的,因为这张表有68个机构列(inst前缀(和100行(个别科学文章(。我不能仅仅选择用NA取代哪些机构,因为有数百个不同的机构,而我只是对保留包含";FC";。
1(dplyr像这样使用mutate/across
library(dplyr)
so %>%
mutate(across(starts_with("inst"), ~ replace(., !grepl("FC", .), NA)))
给予:
inst_1 inst_2 inst_3 inst_4 inst_5
1 FC1 FC1 FC2 FC3 FC1
2 FC2 FC5 FC2 FC6 FC2
3 <NA> <NA> <NA> <NA> <NA>
4 <NA> <NA> <NA> <NA> <NA>
5 <NA> <NA> <NA> <NA> <NA>
2(基本R或仅使用基本R:
ok <- startsWith(names(so), "inst")
repl <- function(x) replace(x, !grepl("FC", x), NA)
replace(so, ok, lapply(so[ok], repl))
3(折叠或使用带有来自(2(的repl的折叠包
library(collapse)
tfmv(so, startsWith(names(so), "inst"), repl)
4(data.table通过data.table,我们定义了一个inst名称向量,并将其与(2(中的repl一起使用。
library(data.table)
DT <- as.data.table(so)
inst <- grep("^inst", names(so))
DT[, (inst) := lapply(.SD, repl), .SDcols = inst]