我有两个不同长度的不同数据帧,每个数据帧都有两个值列。我想要做的是通过编写一个函数来计算每个数据帧中两个值列的每行的平均值和总和,该函数将计算每个数据帧的两个所需列。
这是重新创建数据框的代码:
library(tidyverse)
#Creating dataframes
day1<-c(1,2,3,4,5)
day2<-c(1,2,3,4)
value11<-c(6,7,8,9,10)
value12<-c(11,12,13,14,15)
value21<-c(2,4,6,8)
value22<-c(1,3,5,7)
df1<-data.frame(day1,value11,value12)
df2<-data.frame(day2,value21,value22)
dfs<-list(df1,df2)
names(dfs)<-c("df1","df2")
这是我当前的循环,它能够计算单个数据帧的平均值和总和列:
#creating the new mean and sum columns
for (i in 1:dim(df1)[1]) {
df1$meanval[i] <- mean(df1$value11[i],df1$value12[i])
df1$sumval[i] <- sum(df1$value11[i],df1$value12[i])
我现在想做的是找到一种将该循环同时应用于两个数据帧的方法。这是我尝试使用的:
#creating the new mean and sum columns
SumAndMean<-function(x){
for (i in 1:dim(dfs)[[i]][1]) {
x$meanval[i] <- mean(x[[2]][i],x[[3]][i])
x$sumval[i] <- sum(x[[2]][i],x[[3]][i])
}
}
#Applying function to list of dataframes
lapply(seq_along(dfs), function(i) SumAndMean(dfs[i]))
到目前为止,这会导致错误。我不确定,但我认为这可能与我使用 i 指代 dfs 列表的小节以及 df1 和 df2 的小节有关。我不完全确定如何重写我的函数来解决这个问题。有任何想法吗?谢谢!
一个选项,使用
map
:
map(dfs, ~ mutate(., sum_row = rowSums(across(starts_with("value"))),
mean_row = rowMeans(across(starts_with("value")))))
[[1]]
day1 value11 value12 sum_row mean_row
1 1 6 11 17 8.5
2 2 7 12 19 9.5
3 3 8 13 21 10.5
4 4 9 14 23 11.5
5 5 10 15 25 12.5
[[2]]
day2 value21 value22 sum_row mean_row
1 1 2 1 3 1.5
2 2 4 3 7 3.5
3 3 6 5 11 5.5
4 4 8 7 15 7.5
您所拥有的代码的想法的问题在于(听起来像)您想要同时迭代两个不同的数据帧,但它们具有不同的行数,因此当您到达最后一行时最长的数据帧,代码将在最短的数据帧上返回错误,因为它在那里找不到行。