【问题标题】:R: Comparing fields in matrixR:比较矩阵中的字段
【发布时间】: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 &lt; 3 &amp; df2 &lt; 3] &lt;- "X" ; result[, 1:2] &lt;- "A" ; result[is.na(df1) | is.na(df2)] &lt;- "N"吗?

标签: r matrix compare


【解决方案1】:

你有矩阵,而不是数据框。

一种方法可能是使用 ifelse (和 %in% 一个数字变量, 节省约 50% 的时间以避免时间转换。:

  result <- ifelse(is.na(df1)|is.na(df2),"N",
                   ifelse(df1 %in% 0:2 & df2 %in% 0:2,"X","O"))
  result[,1:2] <- "A"
  result

感谢@DavidArenburg,速度进一步提升

result <- matrix("O",nrow=nrow(df1),ncol=ncol(df1))
result[is.na(df1) | is.na(df2)] <- "N"
result[df1 < 3 & df2 < 3] <- "X"
result[, 1:2] <- "A"

【讨论】:

  • 像@Heroka 的魅力一样工作!我会等到今天晚些时候才接受您的回答,以防仍然出现性能更高的答案!
  • 您是否在 OP 模拟数据的大数据集上对此进行了测试?
  • OP 的模拟数据。当 df1 为 1000 cols/10000 列时,我的解决方案似乎变得相对较慢(约 10 个)。
  • 我目前无法访问我的计算机!明天试试!
  • @David 和 Herka,我为 OP 中的小型数据集添加了基准。将很快获得完整的数据集以更新基准
猜你喜欢
  • 1970-01-01
  • 2012-07-30
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多