标题可能令人困惑,但我想它有一个简单的解决方案。我有自己的函数,我想将相同的函数应用于由两列组成的多个列表。但是我需要对每列分别进行不同的计算。
例如mydata
是:
x1 x2 y1 y2 z1 z2
1 0.0 0.0 0.0 7.8 0.0 8.6
2 8.6 0.0 0.0 7.6 1.6 1.4
3 11.2 7.8 3.4 1.2 7.6 0.0
4 8.4 7.6 21.4 10.2 23.6 0.0
5 0.0 1.2 1.8 7.0 3.2 0.0
6 0.0 10.2 1.4 0.0 0.0 0.0
mydata<-structure(list(x1 = c(0, 8.6, 11.2, 8.4, 0, 0), x2 = c(0, 0,
7.8, 7.6, 1.2, 10.2), y1 = c(0, 0, 3.4, 21.4, 1.8, 1.4), y2 = c(7.8,
7.6, 1.2, 10.2, 7, 0), z1 = c(0, 1.6, 7.6, 23.6, 3.2, 0), z2 = c(8.6,
1.4, 0, 0, 0, 0)), .Names = c("x1", "x2", "y1", "y2", "z1", "z2"
), class = "data.frame", row.names = c(NA, -6L))
而myfun
的功能是:
myfun<- function(x) {
means<-sapply(list(x), function(ss) mean(ss, na.rm = T))
#my point: vars<-sapply(list(y), function(ss) var(ss, na.rm = T))
mean<-means[[1]]
#var<-vars[[1]]
#lists<-list(mean, var)
#names(lists) <- c("mean", "var")
#return(lists)
lists<-list(mean)
names(lists)<-c("mean")
return(lists)
}
我使用了#
来制作零件,稍后将在myfun
中添加它们。
当我尝试
results<-lapply(mydata, myfun)
我可以对每一列应用相同的函数和相同的计算。
如您所见,每个数据(x1-x2, y1-y2, z1-z2)
有2列(x, y, z)
。
我想要的是:
1)获得第一列means
的{{1}}
2)获得第二列(x1, y1, z1)
的{{1}}
3)作为输出;我想查看variances
,(x2, y2, z2)
和mean1
列表下的每个数据的var1
和x
结果,例如:
y
4)使用z
或x-> mean1 (mean of x1)
var1 (var of x2)
y-> mean1 (mean of y1)
var1 (var of y2)
或任何有用的函数循环执行所有这些操作。
注释:
1)我没有将x1和x2归入x,y1和y2归于y。因为如果可以找到lapply
格式的解决方案,那么对我来说它将更有用。但是,如果有必要,我可以将它们分别分组。
2)sapply
函数现在正在查找6列的平均值。我已经指出了用于计算mydata
答案 0 :(得分:1)
我将从拆分数据框开始,以创建具有2列的数据框列表。
此时,您可以使用lapply
或map_dfr
将函数mean_var
应用于列表的每个元素。
map_dfr
的优点是它返回一个数据帧,并绑定函数输出的行。
library(purrr)
my_data_l <- split.default(mydata, rep(1:3, each = 2))
mean_var <- function(x) {
list(mean = mean(x[,1]), var = var(x[,2]))
}
map_dfr(my_data_l, mean_var)
答案 1 :(得分:1)
请考虑先分配您的组,然后使用lapply
进行迭代。实际上,将sapply
与simplify=FALSE
一起用于命名列表。
grps <- unique(gsub("[0-9]", "", colnames(mydata)))
# [1] "x" "y" "z"
myfun <- function(grp)
list(mean = mean(mydata[,paste0(grp, 1)]),
variance = var(mydata[,paste0(grp, 2)]))
mean_var_list <- sapply(grps, myfun, simplify = FALSE)
mean_var_list
# $x
# $x$mean
# [1] 4.7
#
# $x$variance
# [1] 20.87467
#
# $y
# $y$mean
# [1] 4.666667
#
# $y$variance
# [1] 16.53467
#
# $z
# $z$mean
# [1] 6
#
# $z$variance
# [1] 11.85067
或使用默认值simplify=TRUE
并返回一个矩阵。
mean_var_mat <- sapply(grps, myfun)
mean_var_mat
# x y z
# mean 4.7 4.666667 6
# variance 20.87467 16.53467 11.85067