【问题标题】:r - how to avoid looping here?r - 如何避免在这里循环?
【发布时间】:2016-05-06 15:22:49
【问题描述】:

我正在更改我编写的程序。最初,该程序旨在分析具有恒定 6 个元素的“nS”向量的数据。现在我想让程序处理具有从 1 到 100 的动态元素的 nS 向量。

如何重新设计“# 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

【问题讨论】:

    标签: r loops apply lapply sapply


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-09
      • 2012-08-20
      • 2020-06-29
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多