查找行在R dataframe / Datatable中更改值的列索引

时间:2017-09-10 19:10:50

标签: r

假设我有以下数据框:

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。

2 个答案:

答案 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"