【问题标题】:R: Swap Data Table Rows based on column valuesR:根据列值交换数据表行
【发布时间】:2019-01-08 12:28:56
【问题描述】:

我有一个包含两列的数据表:“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

感谢您提供任何帮助。谢谢!

【问题讨论】:

  • 请通过粘贴dput()的内容提供输入data

标签: r data.table


【解决方案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

【讨论】:

    【解决方案2】:

    使用 -

    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
    }
    

    输出

      id prevId
    1 cd     ab
    2 ef     cd
    

    【讨论】:

      猜你喜欢
      • 2021-06-08
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2016-10-25
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多