Примените функцию к списку информационных кадров по строкам, возвращая список информационных кадров - PullRequest
0 голосов
/ 16 апреля 2020

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

 #Some fake data
   df1=data.frame(a=rnorm(100,5,1), b=rnorm(100,5,1))
   df2=data.frame(c=rnorm(100,5,1), d=rnorm(100,5,1), e=rnorm(100,5,1))
   mylist<-list(df1,df2)
   names(mylist)<-c("df1","df2")

 #a function this function will not be about sums, it is just the simplest 
 # function applied across rows I can come up with. 
   lfun<-function(x){apply(x, 1, FUN=function(y){
   out<-data.frame(out0=y[1],
                   out1=sum(y[2:length(y)]), 
                   out2=sum(y[2:length(y)])^2)})
    }

 #how it is currently being invoked and turned into df output
   dfout<-lapply(mylist, lfun)
   lapply(dfout, FUN=function(x){do.call("rbind", x)})

1 Ответ

0 голосов
/ 16 апреля 2020

Рассмотрим rowSums (оболочка apply + sum):

lfun <- function(df) {
   out <- data.frame(out0 = df[,1],
                     out1 = rowSums(df[2:length(df)]), 
                     out2 = rowSums(df[2:length(df)])^2)
}

newlist <- lapply(mylist, lfun)

Чтобы избежать повторного вычисления rowSums дважды, рассмотрите возможность использования transform:

lfun <- function(df) {
   out <- transform(data.frame(out0 = df[,1],
                               out1 = rowSums(df[2:length(df)])), 
                    out2 = out1^2)
}

newlist2 <- lapply(mylist, lfun)

identical(newlist1, newlist2)
# [1] TRUE
...