【问题标题】:sum and average of rows from list of data frames数据框列表中行的总和和平均值
【发布时间】:2020-11-05 09:35:54
【问题描述】:

我有兴趣对数据框列表中的每一行求和。也就是说,第一行需要对列表中的所有数据框求和。同样,第二个等等。 添加完成后,我想取列表中数据帧数的平均值。我用下面的代码来做(乏味)

sample_list<-list(data.frame(x=c(1:5)),data.frame(x=c(6:10)), data.frame(x=c(11:15)) ) ## sample data frame's list

sum_per_person<-matrix(nrow=nrow(sample_list[[1]]),ncol=1) ## create a matrix to store sum of each row from the list of data frames.

number_indi=nrow(sample_list[[1]]) ## number of rows are same in each data frame within the list

iterate_person=1 ## set counter 

while(iterate_person<=number_indi){ ## do a while loop

sum_temp=0 ## set to zero
for(x in 1:length(sample_list)){
## iterate over the sample list
sum_temp<-sum_temp+(sample_list[[x]])[iterate_person,]

} ## iteration ends for the list

sum_per_person[iterate_person,1]<-sum_temp
iterate_person<-iterate_person+1 ## increment 
} ## for loop ends 

## take average
sum_per_person<-sum_per_person/length(sample_list) ## final result 

有没有一种方法可以通过 lapply、apply 以简单的方式完成此任务?

【问题讨论】:

  • 不确定,也许可以用 lambda 完成?

标签: r list dataframe lapply


【解决方案1】:

代替while 循环,R 中的一个选项是获取listReduce 的对应元素的总和,然后除以“sample_list”的length

Reduce(`+`, sample_list)/length(sample_list)
#  x
#1  6
#2  7
#3  8
#4  9
#5 10

或者一个简洁的方法是rowMeans在将其转换为单个data.frame之后

rowMeans(do.call(cbind, sample_list))

【讨论】:

  • 谢谢。不知道Reduce。第二种方法非常花哨和简洁。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多