【发布时间】:2018-09-08 19:45:02
【问题描述】:
我是一名新的 R 程序员,正在尝试通过大量列创建一个循环,以按某个指标衡量数据。
我有大量变量数据集(一些因素,一些数字)。我想遍历我的列,确定哪个是一个因素,然后如果它是一个因素,我想使用一些 tapply 函数来做一些加权并返回一个平均值。我在这里建立了一个可以一次执行此操作的功能:
weight.by.mean <- function(metric,by,x,funct=sum()){
if(is.factor(x)){
a <- tapply(metric, x, funct)
b <- tapply(by, x, funct)
return (a/b)
}
}
I am passing in the metric that I want to weigh and the by argument is what
I am weighting the metric BY. x is simply a factor variable that I would
like to group by.
示例:我有 5 种甜甜圈类型(我的参数 x),我想查看甜甜圈类型使用的平均面团(我的参数 metric),但我需要用用于该甜甜圈类型的面团的量(参数 by)来称量面团。
换句话说,我试图通过不比其他类型更多地加权不同类型的甜甜圈来避免扭曲我的方式(也许我使用很多普通面团制作上釉甜甜圈,但不要使用太多特殊面团制作奶油馅甜甜圈。我希望这是有道理的!
这是我正在处理的函数,用于遍历包含许多可能不同因素变量的大型数据集,例如我之前示例中的“甜甜圈类型”。它还没有功能,因为我不确定还要添加什么。感谢您为我提供的任何帮助。我使用 R 还不到一个月,所以请记住这一点。
我的最终目标是输出所有这些不同方法的矩阵或数据框,但每个因素可能有 5 到 50 个不同的级别,因此行大小取决于每个因素的级别数。
weight.matrix <- function(df,metric,by,funct=sum()){
n <- ncol(df) ##Number of columns to iterate through
ColNames <- as.matrix(names(df))
OutputMatrix <- matrix(1, ,3,nrow=, ncol=3)
for(i in 1:n){
if(is.factor(paste("df$",ColNames[i], sep=""))){
a[[i]] <- tapply(metric, df[,i], funct)
b[[i]] <- tapply(by, df[,i], funct)
}
OutputMatrix <- (a[[i]]/b[[i]])
}
}
【问题讨论】:
-
寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。
标签: r loops if-statement dataframe matrix