Как удалить все переменные с именем .x, .y?

#r

#r

Вопрос:

У меня есть список data.frame (lst1). В каждом data.frame в lst1 у нас есть некоторые переменные, которые выглядят как test.x, test.y, try.x, try.y и т.д.

Я хочу отфильтровать те переменные, которые были созданы путем объединения набора данных, Не отфильтровывая сначала эти переменные (попробуйте, протестируйте и т. Д.). Как мне теперь их отфильтровать?

Спасибо.

Ответ №1:

Вы также можете попробовать это:

 #Data
List <- list(A=data.frame(a=1,b=5,test.x=NA,test.y=5),
             B=data.frame(a=5,b=6,test.x=NA,try.x=7))
#Remove
myfun <- function(x)
{
  i <- which(grepl('.x|.y',names(x)))
  x <- x[,-i]
  return(x)
}
#Apply
List2 <- lapply(List,myfun)
 

Вывод:

 List2
$A
  a b
1 1 5

$B
  a b
1 5 6
 

Ответ №2:

Вот аккуратный подход:

Мы можем использовать эту dplyr::select функцию для выбора только тех столбцов, которые нам нужны. matches() позволяет нам выбирать столбцы с помощью регулярных выражений. \.[xy]$ сопоставляет столбцы, содержащие точку, за которой следует x или y , и $ привязывает совпадение к концу строки.

purrr::map Функция позволяет нам применять выделение к каждому элементу списка. ~ определяет формулу, которая автоматически преобразуется в функцию.

 library(tidyverse)
lst2 <- lst1 %>%
  map(~dplyr::select(.,-matches("\.[xy]$")))

map(lst2, head, 2)
#[[1]]
#  ID name
#1  1    A
#2  2    B
#[[2]]
#  ID name
#1  1    A
#2  2    B
#[[3]]
#  ID name
#1  1    A
#2  2    B
#[[4]]
#  ID name
#1  1    A
#2  2    B
#[[5]]
#  ID name
#1  1    A
#2  2    B
 

Пример данных:

 lst1 <- replicate(5,data.frame(ID = 1:15, name = LETTERS[1:15], test.x = runif(15), test.y = runif(15)),simplify = FALSE)
map(lst1, head, 2)
#[[1]]
#  ID name     test.x    test.y
#1  1    A 0.03772391 0.2630905
#2  2    B 0.11844048 0.2929392
#[[2]]
#  ID name   test.x    test.y
#1  1    A 0.398029 0.5151159
#2  2    B 0.348489 0.9534869
#[[3]]
#  ID name    test.x    test.y
#1  1    A 0.7447383 0.6862136
#2  2    B 0.3623562 0.7542699
#
#[[4]]
#  ID name    test.x    test.y
#1  1    A 0.9341495 0.8660333
#2  2    B 0.8383039 0.6299427
#[[5]]
#  ID name     test.x     test.y
#1  1    A 0.02662444 0.04502225
#2  2    B 0.29855214 0.46189116
 

Комментарии:

1. Ах, да, это делает свою собственную упаковку. Ваш комментарий о $ рабочей версии

2. Если я имею дело с df фреймом данных, могу ли я сделать то же самое df %>% select(-match("\.[xy]$")) ? Я попробовал и получил сообщение об ошибке Error: argument "table" is missing, with no default . Как я должен это исправить?

Ответ №3:

В base R , мы можем использовать endsWith

 lapply(List, function(x) x[!(endsWith(names(x), 
        '.x')|endsWith(names(x), '.y'))])
 

-вывод

 #$A
#  a b
#1 1 5

#$B
#  a b
#1 5 6
 

данные

 List <- list(A = structure(list(a = 1, b = 5, test.x = NA, test.y = 5), class = "data.frame", row.names = c(NA, 
-1L)), B = structure(list(a = 5, b = 6, test.x = NA, try.x = 7), class = "data.frame", row.names = c(NA, 
-1L)))