r - 如何避免在这里循环?

r - how to avoid looping here?

我正在修改我写的一个程序。最初,该程序旨在分析具有常量 6 个元素的 "nS" 向量的数据。现在我希望程序能够处理 nS 个具有从 1 到 100 的动态元素的向量。

如何重新设计“# other need states”下的部分(最好使用应用函数而不是循环)?

# 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

我认为解决这个问题最有效的方法是使用 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 包含多少个状态,这都应该有效。