【问题标题】:subtract pairs of rows for long dataset减去长数据集的行对
【发布时间】:2014-01-29 21:28:31
【问题描述】:

我想找到一种方法在长数据集中减去每两行的时间和米值(每天两次测量),因此创建一个存储这些值的新表。 (03:21-09:37 和 3.2-0.9,依此类推……)。有没有可以自动完成的功能。怎么可能设置呢?我对使用 R 完全陌生,我只需要用 R 弄清楚这些事情

time <- c("03:21","09:37","15:41","21:46","03:54","10:12")
day <- c(1,1,1,1,2,2)
meters <- c(3.2,0.9,3.2,0.9,3.2,0.9)

df <- data.frame(day,time,meters)

  day  time meters
1   1 03:21    3.2
2   1 09:37    0.9
3   1 15:41    3.2
4   1 21:46    0.9
5   2 03:54    3.2
6   2 10:12    0.9

【问题讨论】:

  • 不太清楚。 “03:21-09:37 和 3.2-0.9,等等……”是什么意思?你可以为这个小数据集发布你想要的输出吗?您提到“每天两个措施”,但“day == 1”有 4 个措施。
  • 是的,每天有 4 个措施,因为它们对应于两个潮汐时期。每天第一值涨潮第二低潮第三潮和第四低潮。我想每 6 小时减去一次涨潮和退潮。找到一种减去几行的方法会很棒。第一个和第二个,第三个和第四个,第五个和第六个等等......

标签: r subtraction


【解决方案1】:

下面是一些很快就会想到考虑的选项:

选项 1:使用 TRUEFALSE 计算差异的子集:

Time <- strptime(df$time, format="%H:%M")
TimeD <- Time[c(TRUE, FALSE)] - Time[c(FALSE, TRUE)]
MetersD <- df$meters[c(TRUE, FALSE)] - df$meters[c(FALSE, TRUE)]
cbind(meters = MetersD, time = TimeD)
#      meters      time
# [1,]    2.3 -6.266667
# [2,]    2.3 -6.083333
# [3,]    2.3 -6.300000

选项 2:使用%/% 创建分组变量并使用aggregate

df$pairs <- c(0, 1:(nrow(df)-1) %/% 2)
df$time2 <- strptime(df$time, format="%H:%M")
aggregate(list(meters = df$meters, time = df$time2), 
          by = list(pairs = df$pairs), FUN=function(y) diff(rev(y)))
#   pairs meters       time
# 1     0    2.3 -6.266667 
# 2     1    2.3 -6.083333 
# 3     2    2.3 -6.300000

更新

扩展这个想法来让你的“一天”栏回来也不是太难

with(df, {
  time <- strptime(time, format="%H:%M")
  time <- time[c(TRUE, FALSE)] - time[c(FALSE, TRUE)]
  meters <- meters[c(TRUE, FALSE)] - meters[c(FALSE, TRUE)]
  day <- day[c(TRUE, FALSE)]
  data.frame(day, time, meters)
})
#   day            time meters
# 1   1 -6.266667 hours    2.3
# 2   1 -6.083333 hours    2.3
# 3   2 -6.300000 hours    2.3

【讨论】:

  • 我认为根据 Brandon 的回答,结果应该有 5 行。
  • @BrodieG,是什么让你这么认为?我没有从描述或评论中得到那种印象。
  • @BrodieG 我最初的想法也是。不是很清楚。
  • @BrandonBertelsen,你忘了编辑我的结果 :-) 现在我的答案看起来与你编辑到 OP 问题中的示例数据有误!
  • 哈哈,对不起阿难!我会再次更新。但说真的,我是想偷你的票!
【解决方案2】:

使用diff

# Create a proper date
df$date <- strptime(paste(df$day,df$time),format="%d %H:%M")

new_df <- data.frame(
  diff_meters = abs(diff(df$meters)), 
  diff_time = diff(df$date))

new_df

      diff_meters      diff_time
1         2.3 6.266667 hours
2         2.3 6.066667 hours
3         2.3 6.083333 hours
4         2.3 6.133333 hours
5         2.3 6.300000 hours

如果那是您真正想要的,那么每隔一行很容易获得(从问题和您的评论中都不清楚:

new_df[seq(1,nrow(new_df),2),]

  diff_meters      diff_time
1         2.3 6.266667 hours
3         2.3 6.083333 hours
5         2.3 6.300000 hours

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多