将相同的函数但不同的计算应用于具有lapply

时间:2019-04-19 15:55:03

标签: r loops apply lapply

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

例如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列表下的每个数据的var1x结果,例如:

y

4)使用zx-> 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

的第二列方差的其他部分

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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