【问题标题】:Vector version of do for/while loopdo for/while 循环的矢量版本
【发布时间】:2017-01-10 08:47:57
【问题描述】:

我希望能够编写一种更简洁的方式来执行以下操作:

我有一个 data.frame P (5000rows x 4cols) 并且想在第 1 列中的时间戳落入由向量 TimeStamp 确定的设定范围内时找到第 2,3 和 4 列中的中值(在秒)。

dput(TimeStamp)
c(18, 138, 438, 678, 798, 1278, 1578, 1878, 2178)


dput(head(P))
structure(list(Time = c(0, 5, 100, 200, 500, 1200), SkinTemp = c(27.781, 
27.78, 27.779, 27.779, 27.778, 27.777), HeartRate = c(70, 70, 
70, 70, 70, 70), RespirationRate = c(10, 10, 10, 10, 10, 10)), .Names = c("Time", 
"SkinTemp", "HeartRate", "RespirationRate"), row.names = c(NA, 
6L), class = "data.frame")

例如

for x<i<y in P[,1]
     find median of all values in P[,2], P[,3] and P[,4]
     Put median values into a new matrix with headers SkinTemp, HeartRate and RespirationRate
end

【问题讨论】:

  • 试试aggregate(P[,-1],list(Time=findInterval(P$Time,TimeStamp)),median)
  • 嗨,nicola,谢谢你这么快的回复。 P[,-1] 中的 -1 是什么意思?
  • 这意味着aggregate-call 不包括输入的第一列(在本例中是旧的Time-变量)。

标签: r


【解决方案1】:

你可以试试:

aggregate(P[,-1],list(Time=findInterval(P$Time,TimeStamp)),m‌​edian)  
#  Time SkinTemp HeartRate RespirationRate
#1    0  27.7805        70              10
#2    1  27.7790        70              10
#3    2  27.7790        70              10
#4    3  27.7780        70              10
#5    5  27.7770        70              10

您想根据Time 值所属的区间来划分它们。有一个 R 函数可以做到这一点:findInterval。因此,我们计算每个Time 值的间隔,然后计算aggregate 其他列的值并计算median

【讨论】:

  • 非常感谢您。我愿意接受您的回答,因为您是第一个为我发表评论的人。是否可以将适合 TimeSteps 之间的数据块保存到 data.frame 中,而不仅仅是计算中位数?
  • 很高兴您发现此答案很有用。我不认为我得到你在这里问什么。请记住,不同的请求需要提出不同的问题,所以不要害怕提出新问题。
  • 我的意思是我想将数据传送到一个单独的 data.frame 中,您的聚合函数从中计算中位数。 IE。原始数据,以便我可以将其绘制为单独的块。例如。时间戳 2 和 3 之间的 SkinTemp 的所有数据。
【解决方案2】:

另一种选择是使用cut 函数

P$new <- cut(P$Time, breaks = c(-Inf, TimeStamp, Inf))
aggregate(. ~ new, P, median)

#             new   Time SkinTemp HeartRate RespirationRate
#1      (-Inf,18]    2.5  27.7805        70              10
#2       (18,138]  100.0  27.7790        70              10
#3      (138,438]  200.0  27.7790        70              10
#4      (438,678]  500.0  27.7780        70              10
#5 (798,1.28e+03] 1200.0  27.7770        70              10

【讨论】:

  • 感谢您的回答。我不太明白为什么这产生的答案与@nicola 给出的答案不同。它的变化幅度约为 5%,所以肯定是其中一个答案没有正确地对数据进行分箱......但我不知道如何
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 2018-11-21
  • 2017-03-08
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多