我有一个包含两列的数据表:“ 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
感谢您的协助。谢谢!
答案 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
}