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