如何用另一个大数据帧的内容填充一个大数据帧,而不借助R进行循环索引?

如何用另一个大数据帧的内容填充一个大数据帧,而不借助R进行循环索引?,r,dataframe,indexing,R,Dataframe,Indexing,我有两个大的数据帧,A(~25000行)和B(~275000行),我需要用B的内容填充A。我对R不熟悉,但我以前用Python写过,在那里,使用熊猫中的for循环和索引可以相当快地完成这类事情。但由于在R中使用数据帧索引的循环速度非常慢,因此我编写的方法需要几天才能运行。有人知道我如何更有效地完成以下任务吗 IDs <- c(1,2,3,4,5,6,7,8,9,10) description1 <- c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA) descripti

我有两个大的数据帧,A(~25000行)和B(~275000行),我需要用B的内容填充A。我对R不熟悉,但我以前用Python写过,在那里,使用熊猫中的for循环和索引可以相当快地完成这类事情。但由于在R中使用数据帧索引的循环速度非常慢,因此我编写的方法需要几天才能运行。有人知道我如何更有效地完成以下任务吗

IDs <- c(1,2,3,4,5,6,7,8,9,10)
description1 <- c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA)
description2 <- c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA)
description3 <- c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA)

descriptions <- c('description1','description3','description3','description1','description1','description2','description1','description3','description2','description2')
values <- c(100,200,300,400,500,600,700,800,900,1000)

A <- data.frame(IDs,description1,description2,description3)
B <- data.frame(IDs,descriptions,values)

for (k in 1:nrow(B)){
  for (y in 1:nrow(A)){
    col_index <- which(names(A) == B[k,2])
    column_name <- names(A)[col_index]
    ID_A <- A[y,1]
    ID_B <- B[k,1]
    descriptionA <- A[y,4]
    descriptionB <- B[k,2]
    if ((ID_A == ID_B) && (descriptionB == column_name)){
      A[y,col_index] <- B[k,3]
    }
  }
}

IDs您实际上可以使用
restrape2
包中的
dcast
对数据进行
restrape2
整形:

dcast(B, IDs ~ descriptions)

   IDs description1 description2 description3
1    1          100           NA           NA
2    2           NA           NA          200
3    3           NA           NA          300
4    4          400           NA           NA
5    5          500           NA           NA
6    6           NA          600           NA
7    7          700           NA           NA
8    8           NA           NA          800
9    9           NA          900           NA
10  10           NA         1000           NA

OP指出,由于问题的规模,处理速度至关重要

现在,
dcast
可以从
restrape2
包以及
data.table
包中获得。后者

dcast.data.table
restrape2::dcast
的一个更快的版本,但是 用于
数据。表
s。更重要的是,它能够处理非常复杂的问题
在内存使用方面,与
重塑2::dcast

因此,我想知道对于给定的问题大小,data.frame
A
(这是唯一的
ID
)和data.frame
B
中的275.000行,哪个版本会更快

创建基准数据 标杆管理 对于基准测试,使用了
microbenchmark
包:

bm <- microbenchmark::microbenchmark(
  reshape2 = 
    res1 <- reshape2::dcast(B_DF, IDs ~ d, value.var = "v"),
  datatable = 
    res2 <- data.table::dcast(B_DT, IDs ~ d, value.var = "v"),
  times = 100L
)
bm
对于给定的问题大小,
dcast.data.table
的速度确实是
restrape2::dcast
的两倍。但是,问题规模仍然很小,绝对运行时间可以忽略不计。随着问题规模的增大,差异变得更加明显。对于
B
中2.7m行的问题,运行时间为1.2秒到0.4秒

          IDs   d  v
     1:     1 d07 43
     2:     1 d17 36
     3:     1 d09 49
     4:     1 d21 52
     5:     1 d19 50
    ---             
274996: 25000 d09 47
274997: 25000 d18 46
274998: 25000 d17 47
274999: 25000 d14 64
275000: 25000 d02 57
bm <- microbenchmark::microbenchmark(
  reshape2 = 
    res1 <- reshape2::dcast(B_DF, IDs ~ d, value.var = "v"),
  datatable = 
    res2 <- data.table::dcast(B_DT, IDs ~ d, value.var = "v"),
  times = 100L
)
bm
Unit: milliseconds
      expr      min       lq     mean   median       uq      max neval
  reshape2 69.57883 72.90287 84.61567 84.45119 86.10444 198.6079   100
 datatable 34.66349 36.23196 39.80785 39.67117 40.37139 168.9877   100