Удаление столбцов на основе вектора имен в R - PullRequest
1 голос
/ 07 октября 2019

У меня есть 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

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

В 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)

Если элементы '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

ПРИМЕЧАНИЕ. Не рекомендуется иметь повторяющиеся имена столбцов

1 голос
/ 07 октября 2019

В идеале имена столбцов должны быть уникальными, но если вы хотите сохранить дублированные имена столбцов, мы можем удалить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...