我有类似的问题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])
那是准确的吗?如何以更优雅的方式概括它?
答案 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.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
而不是{ {1}}。