我正在改变我写的程序。最初,该计划旨在分析数据,以及#34; nS"矢量与恒定的6个元素。现在我希望程序能够处理动态元素为1到100的nS向量。
如何重新设计"#other needs states"下的部分? (理想情况下使用apply函数而不是循环)?
# calculate dominant package size for each needstate
package <- as.factor(levels(df$Bagtype)) # name vector with package names
qoo <- data.frame(lapply(package, function(x) sum(df$Nettoerloes[df$NeedState == nS[1] & df$Bagtype == package[x]], na.rm = T))) # first need state + create data frame
names(qoo) <- package # name columns
# other need states
qoo[2,] <- lapply(package, function(x) sum(df$Nettoerloes[df$NeedState == nS[2] & df$Bagtype == package[x]], na.rm = T))
qoo[3,] <- lapply(package, function(x) sum(df$Nettoerloes[df$NeedState == nS[3] & df$Bagtype == package[x]], na.rm = T))
qoo[4,] <- lapply(package, function(x) sum(df$Nettoerloes[df$NeedState == nS[4] & df$Bagtype == package[x]], na.rm = T))
qoo[5,] <- lapply(package, function(x) sum(df$Nettoerloes[df$NeedState == nS[5] & df$Bagtype == package[x]], na.rm = T))
qoo[6,] <- lapply(package, function(x) sum(df$Nettoerloes[df$NeedState == nS[6] & df$Bagtype == package[x]], na.rm = T))
row.names(qoo) <- nS #name rows
答案 0 :(得分:3)
我能看到解决这个问题的最有效方法是使用tapply。
首先从数据集中删除df $ NeedState不包含多个nS的所有行。
df2<-df[!(df$NeedState %in% nS),]
之后我们可以使用tapply来执行总和:
qoo<-tapply(df2$Nettoerloes, list(df2$NeedState,df2$Bagtype), sum)
tapply为list()中的每个变量组合执行它给出的函数,在本例中为sum。
无论nS包含多少个状态,这都应该有效。