将相同的函数但不同的计算应用于具有lapply循环的二进制列的不同列表

问题描述 投票:0回答:2

标题可能令人困惑,但我想它有一个简单的解决方案。我有自己的功能,我想将相同的功能应用于由两列组成的多个列表。但我需要分别对每列进行不同的计算。

举个例子,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)
}

我使用了将在#中添加的myfunfor部件。

当我尝试

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)并作为输出;我想在mean1var1x列表中查看yand zfor每个数据的结果,如:

x-> mean1 (mean of x1)
    var1  (var of x2)

y-> mean1 (mean of y1)
    var1  (var of y2)

4)用lapplysapply或任何有用的功能循环完成所有这些。

笔记:

1)我没有将x,y1和y2下的x1和x2分组。因为如果可以找到mydata形式的解决方案,它对我来说会更有用。但如果有必要,我可以单独分组。

2)myfun函数现在找到6列的方法。我已经指出了用于计算第二列与#的方差的附加部分

r loops apply lapply
2个回答
1
投票

考虑首先分配您的组,然后使用lapply迭代它。实际上使用sapplysimplify=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

1
投票

我首先分割数据帧以创建一个包含2列的数据帧列表。在这一点上,您可以使用lapplymap_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)

© www.soinside.com 2019 - 2024. All rights reserved.