R:根据列值交换数据表行

时间:2019-01-08 12:28:56

标签: r data.table

我有一个包含两列的数据表:“ id”和“ prevId”。我想找到所有实例,其中一行的“ prevId”值等于其后一行的“ id”值。然后,我想交换数据表中这些行的顺序。

到目前为止,我已经尝试弄清下面的逻辑:

data[, index:=.I]
data[, priorMatch:=index[1L], by = cumsum(prevId == id)]
apply(records, 1, FUN = function(x) {
if (!is.na(priorMatch)) {
  records[x[["index"]],] <- records[x[["index"]] - 1,]
  records[x[["index"]] - 1,] <- x
}
})

但是,cumsum()实际上并没有带我前一个最早的行,它的“ prevId”等于当前行的“ id”。

所需结果的示例:

id prevId
ef     cd
cd     ab

将被转换为:

id prevId
cd     ab
ef     cd

感谢您的协助。谢谢!

2 个答案:

答案 0 :(得分:1)

这可以解决问题(至少对于提供的示例数据而言)

dt <- fread("id prevId
             ef     cd
             cd     ab")

#get rownumbers
dt[, row := .I]
#create a column with 'new' rownumbers to order on, using shift
dt[ prevId == shift(id, 1, type = "lead") , row := row + 1]
dt[ id == shift(prevId, 1, type = "lag") , row := row - 1]
#reorder
setkey(dt, row)
#drop the row-column
dt[, row := NULL][]
#    id prevId
# 1: cd     ab
# 2: ef     cd

答案 1 :(得分:0)

使用-

1       10
11      110
21      210
31      310

输出

df <- data.frame(id=c("ef", "cd"), "prevId"=c("cd", "ab"))
rows <- which(as.character(df[,"id"]) == as.character(shift(df[,"prevId"])))
for(i in 1:length(rows)){
  index <- rows[i]
  swap_index <- index - 1

  temp <- df[index, ]
  df[index, ] <- df[swap_index, ]
  df[swap_index, ] <- temp
}