R:用跨多列的NA替换多个不需要的变量



遇到了一些数据纠纷。我试图在书目数据框架中只保留某些作者机构的隶属关系,并用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]

最新更新