假设我有以下数据框:
DF <- data.frame(Col1=c(2,2,1),Col2=c(2,7,5),Col3=c(9,6,4))
我想知道两件事:
如何获取另一个字段,说明该行更改值的列的索引。因此,对于第一行,我们得到1和3,对于第二行和第三行,得到1,2和3.
如何在&#34;之前和之后获得&#34;的字段?对于第一种情况,类似于2 - &gt;在图9中,对于第二和第三,2-> 7,7->分别为6和1 - > 5,5-> 4。
答案 0 :(得分:1)
这个怎么样:
x <- sapply(1:NCOL(df), function(x) rle(df[x,])$values)
x的输出:
[[1]]
Col2 Col3
1 2 9
[[2]]
Col1 Col2 Col3
2 2 7 6
[[3]]
Col1 Col2 Col3
3 1 5 4
然后,如果您喜欢全部范围的前/后值,您可以使用:
lapply(x,function(i) paste0(i,collapse="->"))
[[1]]
[1] "2->9"
[[2]]
[1] "2->7->6"
[[3]]
[1] "1->5->4"
答案 1 :(得分:1)
apply(X = DF, MARGIN = 1, function(x) cumsum(rle(x)$lengths))
#[[1]]
#Col1 Col3
# 2 3
#[[2]]
#Col1 Col2 Col3
# 1 2 3
#[[3]]
#Col1 Col2 Col3
# 1 2 3
apply(X = DF, MARGIN = 1, function(x){
temp = unique(x)
if (length(temp) == 1){
temp
}else{
sapply(1:(length(temp)-1), function(i)
paste(temp[i:min(i+1, length(temp))], collapse = ">"))
}
})
#[[1]]
#[1] "2>9"
#[[2]]
#[1] "2>7" "7>6"
#[[3]]
#[1] "1>5" "5>4"