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