我在命名列中有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])
}
我正在努力思考如何在一行中完成这项工作(一旦编写了函数),但我无法将手指放在上面。有什么建议吗?
答案 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