折叠数据框中的连续行

时间:2016-03-21 02:33:47

标签: r dataframe collapse

我有这个例子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))

1 个答案:

答案 0 :(得分:0)

这并不是很漂亮,但是它会将df$a的缩减版本与df$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