【发布时间】:2018-02-15 17:17:17
【问题描述】:
我有一个下面提到的代码:
library(dplyr)
# Create sample data frame
df <- data.frame(
ID = 1:6,
SR1 = c(123,124,125,125,785,849),
SR2 = c("as#12.c", "ae&14.v", "at$19.e", "at$19.d", "ab&22.n", "ab&22.n"),
DRC1 = c("ABC-1", "ABC-1", "AXX-1", "AXX-1", "AWZ-2", "AWZ-5"),
DX2 = c("SXI", "SXI", NA, "SCV", "DDF", "DDF"),
stringsAsFactors = FALSE
)
# Create a function to give Status with each kind of DRC1 according to your rules
StatusJudge <- function(df_sub) {
if (dim(df_sub)[1] == 1) {
df_sub$Status <- FALSE
}
else {
if (all(!is.na(df_sub$DX2))) {
df_sub$Status <-
ifelse(length(unique(df_sub$DX2)) == 1, TRUE, FALSE)
}
else {
df_sub$Status <-
ifelse(length(unique(df_sub$SR1)) == 1 | length(unique(df_sub$SR2)) == 1, TRUE, FALSE)
if (any(!is.na(df_sub$DX2))) {
df_sub$IDfound[is.na(df_sub$DX2)] <-
df_sub$ID[!is.na(df_sub$DX2)][1]
}
}
}
return(df_sub)
}
# Apply the StatusJudge to each element of df_list and then combine the results
df <- df %>%
mutate(Status = NA, IDfound = NA) %>%
group_by(DRC1) %>%
do(StatusJudge(.)) %>%
arrange(ID)
下面提到的输出:
ID SR1 SR2 DRC1 DX2 Status IDfound
<int> <dbl> <chr> <chr> <chr> <lgl> <int>
1 123 as#12.c ABC-1 SXI TRUE NA
2 124 ae&14.v ABC-1 SXI TRUE NA
3 125 at$19.e AXX-1 <NA> TRUE 4
4 125 at$19.d AXX-1 SCV TRUE NA
5 785 ab&22.n AWZ-2 DDF FALSE NA
6 849 ab&22.n AWZ-5 DDF FALSE NA
这里的问题是我有一个大数据集(约 100 万行),即使在等待了将近 4 个小时后我也没有得到输出,它也花费了太多时间。但同样的代码适用于小型数据集(~10K Rows 等)。
请帮助加速此代码。
【问题讨论】:
-
我不认为
StatusJudge是慢的部分。尝试使用例如StatusJudge <- function(df_sub) {df_sub$Status <- TRUE; df_sub}。如果这很慢,那么优化StatusJudge就没有什么意义了。您可能希望使用data.table而不是dplyr来实现更快的分组转换。 -
@Ista 没用,你能优化我的代码以获得更快的性能吗??
-
请口头描述代码的用途以及代码注释中提到的基本规则。没有这个,仅通过与相当小的样本数据集的预期结果进行比较来重新设计给定的代码是很困难的。谢谢。
标签: r performance loops dataframe dplyr