R: Выберите столбцы из списка фреймов данных, в то время как некоторые столбцы не существуют в нескольких фреймах данных. - PullRequest
0 голосов
/ 22 января 2019

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

Если бы каждый фрейм данных содержал одинаковые столбцы, я бы просто использовал subset(df, select = c("column", "names")), чтобы выбрать интересующий меня столбец.Но как выбрать только существующие столбцы?

У меня есть фиктивный пример, но я хочу использовать в списке функции map или lapply, так как в моих реальных данных много фреймов данных.

Мой фиктивный пример:

df1<- data.frame(a  = seq(0,5),
                 b  = seq(5,10),
                 cc = seq(10,15))

df2<- data.frame(a  = seq(0,5),
                 b  = seq(5,10),
                 d = seq(10,15))


ls <-list(df1, df2)

# select columns,  "cc" column is missing from df2
keep<-c("b", "cc")

Как изменить эту функцию, чтобы выбрать только те столбцы, которые существуют в кадре данных?

lapply(ls, function(x) subset(x, select = keep) )

Ожидаемый вывод с неравномерным номером столбца:

[[1]]
   b cc
1  5 10
2  6 11
3  7 12
4  8 13
5  9 14
6 10 15

[[2]]
   b 
1  5 
2  6 
3  7 
4  8 
5  9 
6 10 

1 Ответ

0 голосов
/ 22 января 2019

Вы можете использовать функцию intersect:

> intersect(c("a", "b", "c"), c("a", "b"))
[1] "a" "b"

т.е. измените свою функцию следующим образом:

> lapply(ls, function(x) subset(x, select = intersect(keep, colnames(x))))
[[1]]
   b cc
1  5 10
2  6 11
3  7 12
4  8 13
5  9 14
6 10 15

[[2]]
   b
1  5
2  6
3  7
4  8
5  9
6 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...