извлекать подсписок фреймов данных из списка фреймов данных на основе условия - PullRequest
0 голосов
/ 19 ноября 2018

У меня большой список фреймов данных, и я хочу создать подсписки, содержащие фреймы данных, которые заполняют условие. Каждый фрейм данных списка имеет одинаковые имена столбцов, и у них есть столбец с именем treatment, который содержит слово ZEO или BLEO. Я хотел бы иметь возможность написать функцию или одну строку, которая позволяет мне извлечь все кадры данных, которые имеют «ZEO». (обратите внимание, что один фрейм данных содержит только одну обработку, поэтому все строки обработки ListofData $ dataframe1 $ равны ZEO), список большой (~ 300 фреймов данных), и у меня есть другие переменные, которые я хотел бы иметь возможность извлекать. До сих пор я пробовал эти методы, но они, похоже, не работают

cond<- sapply(ListofData, function(x) x$treatment == "ZEO") 
test <- ListofData[(cond)]

Имя фрейма данных также содержит информацию о лечении, поэтому я попробовал это, но он возвращает пустой список

test<-ListofData[grep('^[Zeo]+',ListofData)]

Не могли бы вы помочь мне найти способ извлечь нужные мне фреймы данных?

1 Ответ

0 голосов
/ 19 ноября 2018

Решение с использованием регулярных выражений должно работать, см. Этот пример:

#example data
ListofData <- list(ZEO1 = data.frame(xx = 1, treatment = "ZEO"),
                   xx1 = data.frame(xx = 2, treatment = "xx"),
                   ZEO2= data.frame(xx = 3, treatment = "ZEO"))

#using regex 
res <- ListofData[ grepl("^[Zeo]+", names(ListofData)) ]
res 
# $ZEO1
#   xx treatment
# 1  1       ZEO
# 
# $ZEO2
#   xx treatment
# 1  3       ZEO

Вот еще одно решение, использующее значения столбцов, которое возвращает пустые кадры данных, которые мы исключаем, используя nrow и подмножество:

# using lapply, then filter
res <- lapply(ListofData, function(x) x[ x$treatment == "ZEO", ] )
res <- res[ sapply(res, nrow) > 0 ]
res
# $ZEO1
#   xx treatment
# 1  1       ZEO
# 
# $ZEO2
#   xx treatment
# 1  3       ZEO
...