我有两个数据集:(inds个人)和hhs(家庭)。
我正在尝试对inds$income按UID(唯一 ID)分组的所有内容hhs求和,并在家庭中所有个人的收入总和上创建一个新列。有些人没有任何收入,在这种情况下,他们对该变量有“NA”。我正在使用的代码是:
hhs <- left_join(hhs, inds %>% group_by(UID) %>% summarize(hhincome = sum(income, na.rm=TRUE)))
但是,它非常慢。inds有超过 200 万行,hhs大约有 550k 行。我曾经dplyr在相同的数据集中对相似的变量进行平均或计数,通常需要 10 秒或更短的时间来完成这项工作。有什么我做错了吗?有没有办法让它更快?
编辑:正如我所说,我过去常常dplyer获得平均家庭价值而没有问题
hhs <- left_join(hhs, inds %>% filter(AGE > 2) %>% group_by(UID) %>% summarize(L_Bilingual = mean(Bilingual, na.rm=TRUE)))
用上面的代码计算均值需要 5 秒。该功能是否有任何sum()特别之处使其变慢?
使用下面的假数据,在我的机器上进行汇总并加入大约需要 2 秒钟,这是一台新的 Macbook Pro。即使使用较慢的机器,它也不应该超过 10 或 15 秒。连接创建的行是否可能比您想象的多得多?如果您提供有关数据结构的更多详细信息,我们可以更具体地说明可能出现的问题。
library(tidyverse)
library(microbenchmark)
# Generate two data frames with only the UID column in common
set.seed(2)
hhs = data.frame(UID=1:550000, replicate(30, runif(550000))) %>% 
  set_names(c("UID", paste0("V",1:30)))
inds = data.frame(UID=sample(1:550000, 2e6, replace=TRUE), 
                  income=rnorm(2e6, 5e4, 1e4),
                  replicate(20, rnorm(2e6, 5e4, 1e4)))
microbenchmark(join=left_join(hhs, inds %>% group_by(UID) %>% 
                                summarize(hhincome = sum(income, na.rm=TRUE))),
               times=5)
Run Code Online (Sandbox Code Playgroud)Unit: seconds expr min lq mean median uq max neval join 1.924749 1.988773 2.722018 2.0063 2.068044 5.622223 5
| 归档时间: | 
 | 
| 查看次数: | 2400 次 | 
| 最近记录: |