如何用另一个大数据帧的内容填充一个大数据帧,而不借助R进行循环索引?
我有两个大的数据帧,A(~25000行)和B(~275000行),我需要用B的内容填充A。我对R不熟悉,但我以前用Python写过,在那里,使用熊猫中的for循环和索引可以相当快地完成这类事情。但由于在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
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.frameA
(这是唯一的ID
)和data.frameB
中的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