Подмножество нескольких фреймов данных в списке в R на основе строк в другом фрейме данных - PullRequest
1 голос
/ 06 июня 2019

Я пытаюсь разместить несколько фреймов данных, содержащихся в списке, на основе строк, содержащихся в другом фрейме данных.

list.df <- list(
 df.1 = data.frame(LM = c(1:10), LS = c(1:10), PL = c(1:10)), 
 df.2 = data.frame(XY = c(1:10), FE = c(4:13), OI = c(1:10)), 
 df.3 = data.frame(IL = c(1:10), KU = c(9:18), TS = c(1:10)))

df.4 <- data.frame(df.1 = c("LM", "PL", NA), df.2 = c("FE", NA, NA), 
 df.3 = c("IL", "KU", "TS"))

В конце я хочу, чтобы все мои кадры данных выглядели так:

df.1_sub <- subset(list.df[["df.1"]], select = 
   colnames(list.df[["df.1"]]) %in% df.4$df.1)

Мне нужно будет сделать это для примерно 50 наборов данных, и мне было интересно, существует ли способнаписать цикл, чтобы сделать это для всех наборов данных одновременно.

Я пытался использовать циклы lapply и for, но пока безуспешно.Я новичок в использовании списков в R и буду признателен за любую помощь!Это мое первое сообщение о переполнении стека, поэтому, пожалуйста, дайте мне знать, если мое сообщение не подходит,

Ответы [ 2 ]

3 голосов
/ 06 июня 2019

Одним из способов использования Map будет удаление NA значений из df.4 и подмножество соответствующих столбцов из list.df

Map(function(x, y) x[as.character(na.omit(y))], list.df, df.4)

#$df.1
#   LM PL
#1   1  1
#2   2  2
#3   3  3
#4   4  4
#5   5  5
#6   6  6
#7   7  7
#8   8  8
#9   9  9
#10 10 10

#$df.2
#   FE
#1   4
#2   5
#3   6
#4   7
#5   8
#6   9
#7  10
#8  11
#9  12
#10 13

#$df.3
#   IL KU TS
#1   1  9  1
#2   2 10  2
#3   3 11  3
#.....

То же самое можно сделать с помощью purrr::map2

purrr::map2(list.df, df.4, ~.x[na.omit(as.character(.y))])
0 голосов
/ 06 июня 2019

Мы можем использовать complete.cases с Map

Map(function(x, y) x[complete.cases(y)], list.df, df.4)
#$df.1
#   LM LS
#1   1  1
#2   2  2
#3   3  3
#4   4  4
#5   5  5
#6   6  6
#7   7  7
#8   8  8
#9   9  9
#10 10 10

#$df.2
#   XY
#1   1
#2   2
#3   3
#4   4
#5   5
#6   6
#7   7
#8   8
#9   9
#10 10

#$df.3
#   IL KU TS
#1   1  9  1
#2   2 10  2
#3   3 11  3
#4   4 12  4
#5   5 13  5
#6   6 14  6
#7   7 15  7
#8   8 16  8
#9   9 17  9
#10 10 18 10

Или с использованием pmap

library(purrr)  
pmap(list(list.df, df.4), ~ .x[complete.cases(.y)])
...