【问题标题】:Collapse consecutive rows in a data frame折叠数据框中的连续行
【发布时间】:2016-07-07 10:38:08
【问题描述】:

我有这个例子data.frame:

df <- data.frame(a = c(1,2,3,5,7,8),b=c(2,3,4,6,8,9))

我想折叠所有行 i,其 b 列值等于其后续行 (a) 的列值 (i+1) 以便在折叠行中它们的 a 列将是i 行的列,它们的b 列将是i+1 行的列。只要没有满足此条件的连续行,就必须这样做。

对于示例df,第 1-3 行将被折叠,第 4 行保持原样,然后第 5-6 行被折叠,给出:

res.df <- data.frame(a = c(1,5,7), b = c(4,6,9))

【问题讨论】:

  • 你确定'b'中的值对于res.df是正确的
  • 是的。第 1-3 行和第 5-6 行已折叠,第 4 行保持原样。
  • 你提到的条件没有给出预期的输出
  • 或许编辑后的问题更清晰?
  • 你可以用data.frame(a = df$a[!df$a %in% df$b], b = df$b[!df$b %in% df$a]) 来做正确的事情,但我真的认为你必须用lagrle 来发挥创意。

标签: r dataframe collapse


【解决方案1】:

这并不过分漂亮,但它比较了df$adf$b 的缩减版本。

grps <- rev(cumsum(rev(c(tail(df$a,-1) != head(df$b,-1),TRUE))))
#[1] 3 3 3 2 1 1

cbind(df["a"], b=ave(df$b,grps,FUN=max) )[!duplicated(grps),]

#  a b
#1 1 4
#4 5 6
#5 7 9

分解它可能有助于解释第一部分:

tail(df$a,-1) != head(df$b,-1)
#[1] FALSE FALSE  TRUE  TRUE FALSE
c(tail(df$a,-1) != head(df$b,-1),TRUE)
#[1] FALSE FALSE  TRUE  TRUE FALSE  TRUE
rev(c(tail(df$a,-1) != head(df$b,-1),TRUE))
#[1]  TRUE FALSE  TRUE  TRUE FALSE FALSE
cumsum(rev(c(tail(df$a,-1) != head(df$b,-1),TRUE)))
#[1] 1 1 2 3 3 3

【讨论】:

    猜你喜欢
    • 2013-12-13
    • 2017-09-16
    • 1970-01-01
    • 2018-11-22
    • 2012-10-04
    • 2015-03-12
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多