我是一名新的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 )所用的面团。
换句话说,我试图避免扭曲我的手段,因为不比其他人更多地加重不同的甜甜圈类型(也许我使用很多普通的面团来制作甜甜圈,但是不要使用特别的面团来制作奶油馅甜甜圈。我希望这是有道理的!
这是我正在努力循环使用许多可能的不同因子变量的大型数据集的功能,例如&#34;甜甜圈类型&#34;在我之前的例子中。它尚未发挥作用,因为我不确定还有什么要补充的。感谢您为我提供的任何帮助。我一直在使用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]])
}
}
答案 0 :(得分:0)
如果您的每个因素都有不同的级别,那么使用长数据帧而不是宽数据帧会更有意义。例如:
Metric Value Mean
DonutType Glazed 3.0
DonutType Chocolate 5.2
DonutSize Small 1.2
DonutSize Medium 2.3
DonutSize Large 3.6
数据帧不适用于不同长度的矢量。如果要将数据存储在数据框中,则需要对其进行组织,以使所有向量长度相同。 gather()
和spread()
是tidyverse
包中的函数,可用于在长数据帧和宽数据帧之间进行转换。