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 包含多少个状态,这都应该有效。
我正在修改我写的一个程序。最初,该程序旨在分析具有常量 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 包含多少个状态,这都应该有效。