Я начинаю с 2 списков (list_a и list_b), каждый из которых содержит элементы класса df. Моя цель - создать новый список с новым df. Новый df будет содержать все строки из list_a [[1]], которые соответствуют строкам из list_b [[1]] и т. Д. Я могу успешно применить код вручную, но получаю сообщение об ошибке при попытке использовать lapply.
Воспроизводимый пример: 2 списка, каждый с 2 элементами класса df
Список df_a для использования в этом примере
df_a1 <- data.frame(X = c(17,17,18,18), Y=c(105,106,108,109),
Z=c(3,4,4,6))
df_a2 <- data.frame(X = c(17,17,18,18), Y=c(105,106,108,109),
Z=c(5,5,4,5))
list_a <- list(df_a1,df_a2)
df_a_list_names<-c("control", "variable")
names(list_a)<-gsub("\\.swc$", "",df_a_list_names)
df_b1 <- data.frame(X= c(17,17,17,18), Y = c(105,106,107,105),
Z=c(3,4,6,7), I=c(50,50,50,50))
df_b2 <- data.frame(X = c(17,17,17,17), Y = c(105,106,107,108),
Z=c(5,5,6,7), I=c(75,75,75,75))
list_b <- list(df_b1,df_b2)
df_b_list_names<-c("control", "variable")
names(list_b)<-gsub("\\.txt$", "",df_b_list_names)
код, который работает при ручном применении
list_a[[1]]->fobA
list_b[[1]]->fobB
new.df<-fobB%>%semi_join(fobA,by="X")%>%
semi_join(fobA,by="Y")%>%
semi_join(fobA,by="Z")
arrange(new.df, Z)->final.df
Результаты работы без ручного управления
data.frame ': 2 шт. из 4 переменных:
$ X: число 17 17
$ Y: число 105 106
$ Z: число 3 4
$ I: число 50 50
Изменено выше как функция
fxn3<-function(x){
new.df<-list_b%>%semi_join(list_a,by="X")%>%
semi_join(list_a,by="Y")%>%
semi_join(list_a,by="Z")
arrange(new.df, Z)->final.df
return(final.df)
}
Здесь я попробовал использовать lapply с пользовательской функцией
lapply(list_a, "fxn3")->fob.final.listHere is the error message
Я получил следующее сообщение об ошибке
Ошибка в UseMethod ("semi_join"): нет применимого метода для
semi_join применяется к объекту класса "list"