我有一个名为data.frame
的{{1}}。使用 BASE R ,我想知道如何在DATA
中删除以下任何变量:DATA
?
当前,我使用ar = c("out", "Name", "mdif" , "stder" , "mpre")
,但是虽然这会删除不需要的变量,但它会再次创建后缀为DATA[ , !names(DATA) %in% ar]
的新的令人讨厌的变量。
提取后是否可以删除后缀?
注意1::我们无法访问.1
,唯一的输入是r
。
注意2:这是玩具数据,非常感谢功能性解决方案。
DATA
答案 0 :(得分:2)
在base R
中,如果我们创建带有索引的对象,则以后可以重用它,而不必对列名进行其他操作
i1 <- !names(DATA) %in% ar
DATA1 <- setNames(DATA[i1], names(DATA)[i1])
DATA1
# X Y Z X Y Z
#1 2 1 3 1 1 2
#2 2 1 3 NA 1 2
#3 1 1 3 3 1 2
#4 1 2 3 1 2 2
#5 NA 1 3 NA NA 2
#6 NA NA 3 NA NA 2
为实现可重用性,我们可以创建一个函数
f1 <- function(dat, vec) {
i1 <- !names(dat) %in% vec
setNames(dat[i1], names(dat)[i1])
}
f1(DATA, ar)
如果数据集存储在list
中,请使用lapply
遍历list
并应用f1
lst1 <- list(DATA, DATA)
lapply(lst1, f1, vec = ar)
如果不同的list
元素的'ar'元素也不同
arLst <- list(ar1, ar2)
Map(f1, lst1, vec = arLst)
在这里
ar1 <- c("out", "Name")
ar2 <- c("mdif" , "stder" , "mpre")
这也是使用tidyverse
library(dplyr)
library(stringr)
DATA %>%
set_names(make.unique(names(.))) %>%
select(-matches(str_c(ar, collapse="|"))) %>%
set_names(str_remove(names(.), "\\.\\d+$"))
# X Y Z X Y Z
#1 2 1 3 1 1 2
#2 2 1 3 NA 1 2
#3 1 1 3 3 1 2
#4 1 2 3 1 2 2
#5 NA 1 3 NA NA 2
#6 NA NA 3 NA NA 2
注意:建议不要使用重复的列名
答案 1 :(得分:1)
理想情况下,列名应该是唯一的,但是如果您想保留重复的列名,我们可以在提取后使用suffixes
删除sub
DATA1 <- DATA[ , !names(DATA) %in% ar]
names(DATA1) <- sub("\\.\\d+", "", names(DATA1))
DATA1
# X Y Z X Y Z
#1 2 1 3 1 1 2
#2 2 1 3 NA 1 2
#3 1 1 3 3 1 2
#4 1 2 3 1 2 2
#5 NA 1 3 NA NA 2
#6 NA NA 3 NA NA 2