Как связать 2 функции lapply с подмножеством фреймов данных в R? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть список, содержащий 3 кадра данных, и еще один список, содержащий 3 вектора идентификаторов.Я бы хотел поднастроить каждый фрейм данных, проверив, совпадают ли идентификаторы в 1-м кадре с идентификаторами в первом векторе.То же самое для второго вектора 2-го и 3-го и 3-го вектора.Я могу сделать это, используя lapply, но я получаю список из 3 списков, каждый из которых содержит подмножество данных в соответствии с каждым из 3 значений в списке идентификаторов.

Я хочу получить список из 3-х фреймов данных, первый из которых состоит из строк в 1-м кадре данных, имеющих идентификатор в 1-м векторе идентификаторов, а 2-й - из строк во 2-м кадре данных, имеющихидентификатор во втором векторе идентификаторов ... и т. д.

n <- seq(1:20)
id <- paste0("ID_", n)

df1 <-data.frame(replicate(3,sample(0:10,10,rep=TRUE)))
df1$id <- replicate(10, sample(id, 1, replace = TRUE))

df2 <-data.frame(replicate(3,sample(0:10,7,rep=TRUE)))
df2$id <- replicate(7, sample(id, 1, replace = TRUE)) 

df3 <-data.frame(replicate(3,sample(0:10,8,rep=TRUE)))
df3$id <- replicate(8, sample(id, 1, replace = TRUE)) 

list_df <- list(df1, df2, df3)
list_id <- list(c("ID_13", "ID_1", "ID_5"), c("ID_1", "ID_17", "ID_4", 
"ID_9"), c("ID_12", "ID_18"))

subset_df <- lapply(list_df, function(x){
lapply(list_id, function(y) x[x$id %in% y,])
})

Спасибо за помощь!

1 Ответ

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

Как предложил Никола, вы можете использовать Map или mapply в R. Mapply принимает в качестве параметров несколько векторов / списков одинаковой длины и передает значения, соответствующие одному и тому же индексу в векторе / списках, в функцию.

В вашем примере mapply передаст 1-й список list_df и 1 вектор list_id в df и id соответственно и выполнит необходимую обработку и продолжит работу для i = 2,3 ...

mapply(function(df,id){ df[df$id %in% id,]},list_df,list_id,SIMPLIFY = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...