我有类似的问题,比如这个问题。每2行比较一次,并在R 中显示不匹配
我不仅想比较2行,还想比较例如3行、4行等。我这里有一个数据表:
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])
这准确吗?我怎样才能用更优雅的方式概括它呢?
试试这个:
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行进行比较然后它创建由行i
堆叠k
次组成的新的data.table
,因此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
。