r - 根据R中的名称向量删除列
问题描述
我有一个data.frame
叫DATA
. 使用BASE R,我想知道如何删除任何DATA
名为以下任何变量的变量:ar = c("out", "Name", "mdif" , "stder" , "mpre")
?
目前,我使用DATA[ , !names(DATA) %in% ar]
但是虽然这会删除不需要的变量,但它会再次创建一些新的令人讨厌的变量 suffixed .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
解决方案
在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)
如果数据集存储在 a 中list
,请使用lapply
循环list
并应用f1
lst1 <- list(DATA, DATA)
lapply(lst1, f1, vec = ar)
如果'ar'元素对于不同的list
元素也不同
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
注意:不建议使用重复的列名
推荐阅读
- android - Flutter - 单击按钮时在 GridView 中添加容器(小部件)?
- python - 单元测试用例没有在 python 中执行
- javascript - 用户输入正确密码后,如何使提交按钮重定向到另一个页面?
- python - 在 tkinter 中检查时如何打印相应的复选框名称?
- ios - 在 Xcode 中构建档案时出错(我使用过 Unity 和 Firebase)
- javascript - 向下滚动功能
- python - 无法在 jupyter 实验室中导入 pymc3
- r - 工作空间中加载的包和对象的源代码引用 (srcref)
- vba - 我收到一个未知的文件路径错误,我不知道为什么?
- ruby-on-rails - 在 Windows 上运行 bundle install 时遇到问题