【问题标题】:Summing up prior rows contingent on ID #'s in R, for loop vs apply根据 R 中的 ID #'s 总结先前的行,for 循环与应用
【发布时间】:2014-06-19 00:01:11
【问题描述】:

我有一个数据框,其中包含 5 个不同盒子中单位的 xyz 坐标,全部为 4x4x8,因此总共有 128 个可能的位置。单位都是不同的长度。因此,即使我知道单位的坐标(3 个单位,左侧 2 个单位,向上 1 个单位),我也不知道该单位在盒子中的确切位置(12' 英寸,14' 左侧,30' 向上?) . z维度对应长度,是我感兴趣的维度。

我的直觉是运行一个 for 循环求和值,但这通常不是 R 中最有效的。for 循环的关键元素如下:

master$unitstartpoint<-if(master$unitz)==1 0
master$unitstartpoint<-if(master$unitz)>1 master$unitstartpoint[i-1] + master$length[i-1]

即如果是z维的第一个,则单元起点为0,否则为前一个单元的起点+前一个单元的长度。这是数据:

# generate dataframe
master<-c(rep(1,128),rep(2,128),rep(3,128),rep(4,128),rep(5,128))
master<-as.data.frame(master)

# input basic data--what load number the unit was in, where it was located 
# relative other units
master$boxNumber<-master$master
master$unitx<-rep(c(rep(1,32),rep(2,32),rep(3,32),rep(4,32)),5)
master$unity<-c(rep(1,8),rep(2,8),rep(3,8),rep(4,8))
master$unitz<-rep(1:8,80)

# create unique unit ID # based on load number and xyz coords.
transform(master,ID=paste0(boxNumber,unitx,unity,unitz))

# generate how long the unit is. this length will be used to identify unit
# location in the box
master$length<-round(rnorm(640,13,2))

我猜有一种相对简单的方法可以使用applyby 执行此操作,但我不熟悉这些功能。

额外信息:单元 ID 是唯一的,主数据帧分别按 boxNumber、unitx、unity 和 unitz 排序。

这就是我的目标:

length unitx unity unitz unitstartpoint
15     1     1     1     0
14     1     1     2     15
11     1     1     3     29
13     1     1     4     40

任何指导将不胜感激。谢谢!

【问题讨论】:

  • 请添加一个所需结果的小例子。

标签: r for-loop sum apply


【解决方案1】:

听起来您只想要每个框/x/y 组合沿 z 方向的累积总和。我使用累积总和,否则如果您在 z=1 时重置为 0,您的定义将在 z=8 时保留长度。我们可以通过ave轻松做到这一点

clength <- with(master, ave(length, boxNumber, unitx, unity, FUN=cumsum))

我完全确定您想要返回哪些值,但此列大致转换为您在上面重新定义长度的方式。如果我结合原始数据并查看 x=1, y=1:​​4 的第一个框的总长度

# head(subset(cbind(master, ml), unitz==8),4)

   master boxNumber unitx unity unitz length   ID  ml
8       1         1     1     1     8     17 1118 111
16      1         1     1     2     8     14 1128 104
24      1         1     1     3     8     10 1138  98
32      1         1     1     4     8     10 1148  99

我们会看到这些位置的总长度。由于我们使用的是cumsum,因此我们总结z 已按照您的指示进行排序。如果您只想要每个盒子/x/y 组合的总长度,您可以将 cumsum 替换为 sum

【讨论】:

  • 行得通!非常感谢,avecumsum 绝对比 for 循环简单得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2020-06-17
  • 2021-02-28
  • 2020-05-02
  • 2017-09-12
相关资源
最近更新 更多