используя lapply и filter для подмножества фреймов данных с шаблоном в фильтруемом столбце - PullRequest
0 голосов
/ 12 декабря 2018
  • Работа с R *

У меня есть список из 16 фреймов данных, в которых каждый фрейм данных соответствует отдельному году.Чтобы сохранить порядок, когда я создал эти dfs, я добавил суффикс к каждому столбцу в зависимости от года каждого df (например, поле area в df в 2002 году называется «area_2», а 2003 - «area_3».

Среди столбцов DF есть поле, имеющее два возможных значения (0 или 1, как представление True или False).

Я хочу создать списки подмножеств в зависимости от возможныхполя этих подмножеств, такие как строки каждого df, в которых это поле равно 1, или 0.

Если бы все поля были названы одинаково, я мог бы использовать строку:

subset <- lapply(df.list, function(x) dplyr::filter(x, fieldname == "1"))

Тем не менее, имя поля по-разному именуется в каждом члене списка: «fieldname_2», «fieldname_3» - вплоть до 18 (пропуск 8).

Тогда возникает вопрос:это простой способ выполнить это подмножество в списке, установив функцию для поиска имени поля с шаблоном и изменяющим суффиксом.

фиктивный пример, на котором можно попрактиковаться в фильтрации:

valuesx <- c(1,4,3,1,2,5,6,4)
valuesy <- c(4,3,7,1,8,5,2,1)

column_2 <- c(1,1,1,1,0,0,0,0)
column_3 <- c(1,0,1,1,0,0,1,0)

df1<- data.frame(value = valuesx, column_2 = column_2)
df2<- data.frame(value = valuesy, column_3 = column_3)

list_df <- list(df1, df2)

Желаемый результат: новый список со строками каждого DF, в котором «столбец *» == 1

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы можете сделать это ...

lapply(list_df,function(x) x[x[,grep("column",names(x))]==1,])

[[1]]
  value column_2
1     1        1
2     4        1
3     3        1
4     1        1

[[2]]
  value column_3
1     4        1
3     7        1
4     1        1
7     2        1

* grep находит столбцы с именами, включая текст column, и использует их для фильтрации - независимо от того, где они находятся в кадре данных.

0 голосов
/ 12 декабря 2018

Поскольку имена столбцов отличаются, используйте индекс для подмножества data.frame s после цикла list с lapply

new_listdf <- lapply(list_df, function(x) x[x[[2]] == 1, ])
new_listdf
#[[1]]
#  value column_2
#1     1        1
#2     4        1
#3     3        1
#4     1        1

#[[2]]
#  value column_3
#1     4        1
#3     7        1
#4     1        1
#7     2        1

Или другой вариант - tidyverse

library(tidyverse)
list_df %>% 
     map(~ .x %>% 
             filter_at(vars(matches('column')), any_vars(. == 1)))
#[[1]]
#  value column_2
#1     1        1
#2     4        1
#3     3        1
#4     1        1

#[[2]]
#  value column_3
#1     4        1
#2     7        1
#3     1        1
#4     2        1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...