【问题标题】:Compare every n rows and show boolean vector比较每 n 行并显示布尔向量
【发布时间】:2018-07-13 13:21:02
【问题描述】:

我在这个问题Compare every 2 rows and show mismatches in R有类似的问题

我不仅想比较 2 行,还想比较 3、4 等。 我这里有一个 data.table:

DT <- data.table(A = rep(1:2, 2), B = rep(1:4, 2), C = rep(1:2, 1), key = "A")

然后我用

dfs <- split(DT, DT$A)
comp <- function(x) sapply(x, function(u) u[1]==u[2])
matches <- sapply(dfs, comp)

对于 3 行:

comp <- function(x) sapply(x, function(u) u[1]==u[2] & u[1]==u[3])

准确吗?如何以更优雅的方式概括它?

【问题讨论】:

  • 为什么要按A 列拆分数据?
  • 除了 stas 的问题之外,这里的“比较”是什么意思还不清楚。如果你除以 A,当然每个 df 中 A 的每个值都将相同,因此该行保证为 TRUE。如果你想通过 A 检查每列的唯一性,有 ... DT[, lapply(.SD, function(x) uniqueN(x) == 1L), by=A]
  • 感谢您的回答。我想按 A 拆分,作为我需要拆分数据的某些 ID 的示例。我想检查每列的唯一性(或重复性)。但是,如果 B 中的所有值都相同,则为 TRUE,如果至少有一个不同则为 FALSE。
  • 我还对数据集进行了一些编辑,因为当你按 A 拆分时,仍然会有 3 行要比较。
  • 预期输出:` 1 2 A TRUE TRUE B FALSE FALSE C TRUE TRUE`

标签: r data.table compare rows


【解决方案1】:

试试这个:

comp2 <- function(dt, i, rws){
      k <- length(rws)
      tmp <- as.numeric(dt[i])
      tmp <- as.data.table(matrix(rep(tmp, k), nrow = k, byrow = TRUE, dimnames = list(NULL, colnames(dt))))
      ans <- (dt[rws] == tmp)
      ans
}

这个函数接受三个参数: -> dt你的data.table(或从你原来的拆分获得的子数据表,由你决定) -> i -- 要比较的行 -> rws -- 要比较 i 与的行号向量(例如,c(2,3,4) 将比较 i 与第 2、3 和 4 行 然后它会创建一个新的data.table,其中包含i 堆叠k 次的行,因此可以将data.frame 与data.frame 进行比较。

示例:

comp2(DT, 1, c(2, 3, 4))
#       A     B     C
#[1,]  TRUE FALSE  TRUE
#[2,] FALSE FALSE FALSE
#[3,] FALSE FALSE FALSE

将data.table DT 的第 1 行与第 2、3 和 4 行进行比较。

如果您希望您的输出告诉您您选择的行是否与至少一个您正在比较的行不同,那么您需要一个额外的操作colSums(ans) == k 而不是ans .

【讨论】:

  • 您好,非常感谢您的回答。如果我将有非数字值,例如时间戳作为列值?
  • @Jane 任何承认== 作为比较运算符的对象类型都应该使用上面的代码。最好的检查方法是尝试!
猜你喜欢
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 2020-06-04
  • 2019-05-28
  • 2012-08-19
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多