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

时间:2016-05-06 15:22:49

标签: r loops apply lapply sapply

我正在改变我写的程序。最初,该计划旨在分析数据,以及#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

1 个答案:

答案 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包含多少个状态,这都应该有效。