标题可能令人困惑,但我想它有一个简单的解决方案。我有自己的功能,我想将相同的功能应用于由两列组成的多个列表。但我需要分别对每列进行不同的计算。
举个例子,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
for部件。
当我尝试
results<-lapply(mydata, myfun)
我可以对每列应用相同的功能和相同的计算。
如您所见,每个数据(x1-x2, y1-y2, z1-z2)
有2列(x, y, z)
。
我想要的是:
1)获得第一列means
的(x1, y1, z1)
2)获得第二列variances
的(x2, y2, z2)
3)并作为输出;我想在mean1
,var1
和x
列表中查看y
and z
for每个数据的结果,如:
x-> mean1 (mean of x1)
var1 (var of x2)
y-> mean1 (mean of y1)
var1 (var of y2)
4)用lapply
或sapply
或任何有用的功能循环完成所有这些。
笔记:
1)我没有将x,y1和y2下的x1和x2分组。因为如果可以找到mydata
形式的解决方案,它对我来说会更有用。但如果有必要,我可以单独分组。
2)myfun
函数现在找到6列的方法。我已经指出了用于计算第二列与#
的方差的附加部分
考虑首先分配您的组,然后使用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
我首先分割数据帧以创建一个包含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)