基于R中的名称向量删除列

基于R中的名称向量删除列,r,list,function,loops,dataframe,R,List,Function,Loops,Dataframe,我有一个名为data的data.frame。使用BASE R,我想知道如何删除数据中名为以下任何变量:ar=c(“out”、“Name”、“mdif”、“stder”、“mpre”) 目前,我在%ar中使用了DATA[,!names(DATA)%,但在删除不需要的变量的同时,它又创建了一些新的讨厌变量,后缀为.1 提取后,是否可以只删除后缀 注1:我们无法访问r,唯一的输入是数据 注2:这是玩具数据,欢迎提供功能解决方案 r <- list( data.frame(Name = rep(

我有一个名为
data
data.frame
。使用BASE R,我想知道如何删除
数据中名为以下任何变量:
ar=c(“out”、“Name”、“mdif”、“stder”、“mpre”)

目前,我在%ar中使用了
DATA[,!names(DATA)%
,但在删除不需要的变量的同时,它又创建了一些新的讨厌变量,后缀为
.1

提取后,是否可以只删除后缀

注1:我们无法访问
r
,唯一的输入是
数据

注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

r理想情况下列名应该是唯一的,但是如果您想保留重复的列名,我们可以在提取后使用
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

DATA1理想情况下列名应该是唯一的,但是如果您想保留重复的列名,我们可以在提取后使用
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

DATA1在
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
如果“ar”元素对于不同的
列表
元素也不同

arLst <- list(ar1, ar2)
Map(f1, lst1, vec = arLst)

注意:不建议在
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
如果“ar”元素对于不同的
列表
元素也不同

arLst <- list(ar1, ar2)
Map(f1, lst1, vec = arLst)

注意:不建议使用重复的列名

创建变量是因为您使用相同的列名组合了两个数据帧。一个数据帧不能有两个同名的列,因此R向每个重复项添加.1。它与特定列的提取无关。那么您期望的输出是什么呢?是要删除那些
.1
变量,还是要删除后缀?创建这些变量是因为您组合了两个具有相同列名的数据框。一个数据帧不能有两个同名的列,因此R向每个重复项添加.1。它与特定列的提取无关。那么您期望的输出是什么呢?你想删除那些
.1
变量还是要删除后缀?顺便问一下,我知道在Base R中有没有办法检查输入文件是否为
csv
?顺便问一下,在Base R中有没有办法检查输入文件是否为
csv
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