【发布时间】:2015-11-30 14:50:18
【问题描述】:
我有两个要比较的数据框: 如果两个数据帧中的特定位置满足要求,则将“X”分配给单独数据帧中的该特定位置。
我怎样才能以有效的方式获得预期的输出?真正的 data frame 包含 1000 列,包含数千到数百万行。
我认为data.table 将是最快的选择,但我还不了解data.table 的工作原理
预期输出:
> print(result)
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
# [1,] "A" "A" "O" "X" "X" "X" "X" "O" "O"
# [2,] "A" "A" "O" "X" "X" "X" "X" "O" "O"
# [3,] "A" "A" "O" "X" "X" "X" "X" "O" "X"
我的代码:
df1 <- structure(c(1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 1, 1, 1, 1, 1, 2, 2,
2, 2, 2, 2, 3, 3, 3, 2, 0, 1), .Dim = c(3L, 9L), .Dimnames = list(
c("A", "B", "C"), NULL))
df2 <- structure(c(1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 1, 1, 1, 1, 1, 2, 2,
2, 2, 2, 2, 1, 3, 3, 4, 4, 2), .Dim = c(3L, 9L), .Dimnames = list(
c("A", "B", "C"), NULL))
result <- matrix("O", nrow(df1), ncol(df1))
for (i in 1:nrow(df1))
{
for (j in 3:ncol(df1))
{
result[i,1] = c("A")
result[i,2] = c("A")
if (is.na(df1[i,j]) || is.na(df2[i,j])){
result[i,j] <- c("N")
}
if (!is.na(df1[i,j]) && !is.na(df2[i,j]) && !is.na(df2[i,j]))
{
if (df1[i,j] %in% c("0","1","2") & df2[i,j] %in% c("0","1","2")) {
result[i,j] <- c("X")
}
}
}
}
print(result)
编辑
我喜欢@David 和@Heroka 的解决方案。 在一个小数据集上,Heroka 的解决方案是原始解决方案的 125 倍,而 David 的解决方案是原始解决方案的 29 倍。 这是基准:
> mbm
Unit: milliseconds
expr min lq mean median uq max neval
original 1058.81826 1110.481659 1131.81711 1112.848211 1124.775989 1428.18079 100
Heroka 8.46317 8.711986 9.03517 8.914616 9.067793 18.06716 100
DavidAarenburg() 35.58350 36.660565 39.85823 37.061160 38.175700 53.83976 100
非常感谢大家!
【问题讨论】:
-
那些不是 data.frames 或 data.tables,所以我要删除标签。你在看矩阵。这些是 R 中对象的不同“类”。
-
我已经编辑了标题以反映这一点。
-
这不就是
result[df1 < 3 & df2 < 3] <- "X" ; result[, 1:2] <- "A" ; result[is.na(df1) | is.na(df2)] <- "N"吗?