比较每n行并显示布尔向量

时间:2018-07-13 13:21:03

标签: r data.table compare rows

我有类似的问题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])

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

1 个答案:

答案 0 :(得分:0)

尝试一下:

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(或将原始数据拆分为您而获得的sub-data.tables)  -> i-您要比较的行  -> rws-您想与之比较的行向量i(例如c(2,3,4)会将i与行2、3和4进行比较 然后,它会创建一个新的data.table,它由i次堆叠的行k组成,因此可以进行data.framedata.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而不是{ {1}}。