Vectorise这个R循环和自定义功能

时间:2016-08-30 05:36:13

标签: r loops vectorization

我在命名列中有data.frame分数,我需要根据定义哪个rowMeans需要分组的索引文件获取某些列的colNames列。我想同时这样做,因为它目前在一个循环中完成,该循环传入当前的“集群”以进行处理。见下文。

我有两个数据框,一个是带有以下内容的索引文件(另外还有更多,例如obv)

set.seed(42)
index <- data.frame(area=c("area1","area1","area1","area2","area2","area2","area1",
    "area1","area4","area5"), name=c(paste0("name",sample(6,10,replace=T))))

另一个是数据文件,这里又是一个贫穷的例子

data <- data.frame(name1=sample(10,5),name2=sample(10,5),name3=sample(10,5),
       name4=sample(10,5),name5=sample(10,5),name6=sample(10,5))

我创建了一个函数,根据'index'df

返回构成区域的'data'df列的rowMeans
myfun <- function (curr.target) {
       target.cols <- as.character(index$name[index$area==curr.target])
        return(rowMeans(data[target.cols],na.rm=T))
    }

然后我使用该函数通过遍历区域来获取区域的行方式。

for (i in seq_along(unique(index$area))){
  data[,as.character(unique(index$area))[i]] <- myfun(as.character(unique(index$area))[i])
}

我正在努力思考如何在一行中完成这项工作(一旦编写了函数),但我无法将手指放在上面。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我们可以split命名&#39;列中的索引&#39;通过&#39; area&#39;,然后循环遍历list,将数据&#39;基于&#39;名称&#39;列中的索引&#39;并获得rowMeans

sapply(split(as.character(index$name), index$area), function(x) rowMeans(data[x]))

答案 1 :(得分:2)

像这样使用sapply()和cbind()

uia <- unique(index$area)
cbind(data, sapply(uia, myfun))

结果:

  name1 name2 name3 name4 name5 name6 area1    area2 area4 area5
1     5    10    10     6     8     9   8.2 6.666667     6     8
2     7     9     2     4    10     1   5.6 6.000000     4    10
3     8     1     8     8     4     2   3.4 6.666667     8     4
4     2     4     7     9     5     7   5.0 7.666667     9     5
5     3     7     1    10     1     4   3.8 7.000000    10     1