【发布时间】:2019-10-04 23:01:33
【问题描述】:
我需要在使用之前操作的子结果的同时依次分析数据集。
正如 R 所知,我决定使用它,我尝试的解决方案之一是使用 for 循环。
我循环遍历的数据集有大约 800 万行 4 列。
我使用 data.table 并且变量是字符类型,例如。 “XXXXXXXXX”
我试图循环,但每个周期大约需要 0.7 秒,而“
谁能推荐一个更好的技术。可能是 rcpp、apply 或其他什么?
感谢您的支持,
霍尔格
'%!in%' <- function(x,y)!('%in%'(x,y))
library('data.table')
dt_loop <- data.table(
paste0("XXXXXXXXXX", 1:80000000),
paste0("YXXXXXXXXX", 1:80000000),
paste0("ZXXXXXXXXX", 1:80000000),
paste0("AXXXXXXXXX", 1:80000000)
)
colnames(dt_loop)[colnames(dt_loop)=="V1"] <- "m"
colnames(dt_loop)[colnames(dt_loop)=="V2"] <- "c"
colnames(dt_loop)[colnames(dt_loop)=="V3"] <- "ma"
colnames(dt_loop)[colnames(dt_loop)=="V4"] <- "unused"
for(i in 1:nrow(dt_loop)){
m <- dt_loop$m[i]
c <- dt_loop$m[i]
if(m %!in% dt_loop$ma[1:i] & c %!in% dt_loop$ma[1:i]){
dt_loop$ma[i] <- m
} else {
if(m %in% dt_loop$ma[1:i]){
dt_loop$ma[i] <- m
} else {
dt_loop$ma[i] <- c
}
}
}
【问题讨论】:
-
如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。我们不需要全部 800 万行,但我们确实需要一些东西来测试和比较结果。用语言描述你正在尝试做的事情也是一个好主意;可能会有更好的策略。
-
这段代码似乎从一个数据集开始,其中四列中的任何值都没有重复。然后,对于每一行,我们查看
m是否在ma中没有出现(它没有),如果c在ma中没有出现(它没有)。鉴于此,在该行中将ma替换为m,然后重复。我预计这将导致所有行的ma设置为m。我错过了什么?
标签: r performance loops