R 更快地连接数据帧
我目前正在通过一个id合并12个不同的数据帧,每个数据帧为480,00 obs,并添加列,因此它成为一个48k obs x 14变量数据帧。然而,这需要花费太长的时间来处理,我正在寻找一种更快的方法来处理 例子 dput:R 更快地连接数据帧,r,data.table,dplyr,R,Data.table,Dplyr,我目前正在通过一个id合并12个不同的数据帧,每个数据帧为480,00 obs,并添加列,因此它成为一个48k obs x 14变量数据帧。然而,这需要花费太长的时间来处理,我正在寻找一种更快的方法来处理 例子 dput: #一月数据 jan不知道这是否会更快,但是: list(jan = jan %>% rename(PRISM = PRISM_ppt_stable_4kmM2_193301_bil), feb = feb %>% rename(PRISM = PRIS
#一月数据
jan不知道这是否会更快,但是:
list(jan = jan %>% rename(PRISM = PRISM_ppt_stable_4kmM2_193301_bil),
feb = feb %>% rename(PRISM = PRISM_ppt_stable_4kmM2_193302_bil),
mar = mar %>% rename(PRISM = PRISM_ppt_stable_4kmM2_193303_bil)) %>%
bind_rows(.id = "month") %>%
spread(month, PRISM)
下面是一种使用数据表
和重塑2
library(data.table)
library(reshape2)
# create a list of data frames, and coerce to data.tables
month_list <- lapply(list(jan,feb,mar),setDT)
# add id column with old variable name and rename value column
for(i in seq_along(month_list)){
set(month_list[[i]],j="ID",value = names(month_list[[i]])[2])
setnames(month_list[[i]], names(month_list[[i]])[2], "value")
}
# put in long form
long_data <- rbindlist(month_list)
# then use `dcast.data.table` to make wide
wide <- dcast.data.table(long_data, gridNumber~ID, value = 'value')
库(data.table)
图书馆(E2)
#创建数据帧列表,并强制为data.tables
月份列表在数据与colnames()
合并后,我负责重命名。在这种情况下,所有PRISM列都必须具有相同的名称,才能使bind\u行正常工作。列表的名称(jan=)将在重塑后作为棱镜列的新名称结束,这非常快;虽然,我不明白中间的循环。为什么这是一个必要的步骤?@amsterl,for循环正在添加一列来标识数据集的名称(通过第二列的名称,然后重命名第二列,以允许数据以长格式存储在3列中)1.9.6中是否仍有必要加载reforme2
?@jangorecki可能没有。可能值得注意的是,长格式的堆叠取决于列的类别是否相同(与OP相同)。。。在这种情况下,我会坚持长格式。
list(jan = jan %>% rename(PRISM = PRISM_ppt_stable_4kmM2_193301_bil),
feb = feb %>% rename(PRISM = PRISM_ppt_stable_4kmM2_193302_bil),
mar = mar %>% rename(PRISM = PRISM_ppt_stable_4kmM2_193303_bil)) %>%
bind_rows(.id = "month") %>%
spread(month, PRISM)
library(data.table)
library(reshape2)
# create a list of data frames, and coerce to data.tables
month_list <- lapply(list(jan,feb,mar),setDT)
# add id column with old variable name and rename value column
for(i in seq_along(month_list)){
set(month_list[[i]],j="ID",value = names(month_list[[i]])[2])
setnames(month_list[[i]], names(month_list[[i]])[2], "value")
}
# put in long form
long_data <- rbindlist(month_list)
# then use `dcast.data.table` to make wide
wide <- dcast.data.table(long_data, gridNumber~ID, value = 'value')