根据R

时间:2019-10-07 01:42:25

标签: r list function loops dataframe

我有一个名为data.frame的{​​{1}}。使用 BASE R ,我想知道如何在DATA中删除以下任何变量:DATA

当前,我使用ar = c("out", "Name", "mdif" , "stder" , "mpre"),但是虽然这会删除不需要的变量,但它会再次创建后缀为DATA[ , !names(DATA) %in% ar]的新的令人讨厌的变量。

提取后是否可以删除后缀?

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

注意2:这是玩具数据,非常感谢功能性解决方案。

DATA

2 个答案:

答案 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