我有一个data.frame
叫DATA
。使用BASE R,我想知道如何删除 DATA
中的任何变量其名称为以下任意一个:ar = c("out", "Name", "mdif" , "stder" , "mpre")
?
目前,我使用DATA[ , !names(DATA) %in% ar]
但是,虽然这删除了不需要的变量,但它再次创建了一些新的令人讨厌的变量,后缀为 .1
.
提取后是否可以只删除后缀?
注意1:我们无法访问r
,唯一的输入是 DATA
.
注2:这是玩具数据,我们赞赏功能性解决方案。
r <- list(
data.frame(Name = rep("Jacob", 6),
X = c(2,2,1,1,NA, NA),
Y = c(1,1,1,2,1,NA),
Z = rep(3, 6),
out = rep(1, 6)),
data.frame(Name = rep("Jon", 6),
X = c(1,NA,3,1,NA,NA),
Y = c(1,1,1,2,NA,NA),
Z = rep(2, 6),
out = rep(1, 6)))
DATA <- do.call(cbind, r) ## DATA
ar = c("out", "Name", "mdif" , "stder" , "mpre") # The names for exclusion
DATA[ , !names(DATA) %in% ar] ## Current solution
#>
# X Y Z X.1 Y.1 Z.1 ## X.1 Y.1 Z.1 are automatically created but no needed
# 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
最佳答案
理想情况下,列名称应该是唯一的,但如果您想保留重复的列名称,我们可以在提取后使用 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
关于根据 R 中的名称向量删除列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58262597/