避免R中的for循环

时间:2016-03-24 00:35:05

标签: r for-loop optimization

我确定之前已经发布了类似的问题,但没有一个答案我找不到特定于我的查询的答案。

我有以下代码检查第2列中的每一行是否为“STRT”,如果找不到该值,则会复制上一行中第3列中的值。目前这个程序运行时间超过1小时,因为我有一个行数超过300,000的数据集。

for (i in 1:nrow(RTable)) {
    if (RTable[i,2] != "STRT") {
        RTable[i,3] <- RTable[i-1,3]
    }
}

理想情况下,我希望有一个看起来像这样的解决方案

ifelse(RTable $ col2!=“STRT”,RTable $ col3 [当前行] = RTable $ col3 [当前行-1]

任何帮助将不胜感激。在此先感谢您的帮助!!!

3 个答案:

答案 0 :(得分:2)

创建临时变量

RTable$col4<-lag(RTable$col3)

根据需要使用ifelse

library(dplyr)
RTable %>% mutate(col3=ifelse(col2!="STRT",col3,col4))

答案 1 :(得分:1)

我们可以使用setDT(RTable)。转换&#39; data.frame&#39;到&#39; data.table&#39; (lag),创建&#39; col3&#39;的shift使用:=(&#34; col4&#34;),并指定(col2)&#39; col4&#39;的值到&#39; col3&#39;其中library(data.table) setDT(RTable)[, col4 := shift(col3)][col2!="STRT", col3 := col4] 不等于&#34; STRT&#34;。

function print(str) {
  $("#result").append("<p>" + str + "</p>");  
}

print(["A", "B", "C"].join()); // "A,B,C"
print(["A", "B", "C"].join("-")); // "A-B-C"
print(["A", "B", "C"].join("||")); // "A||B||C"
print(["A", "B", "C"].join("")); // "ABC"

答案 2 :(得分:0)

可能会创建第四列,这是您的第三列移位,然后使用您的ifelse声明:

a = c(0,0,0,0)                            # just so the column indices match to yours
x = c(1,2,3,4)
y = c(2,3,4,5)
RTable = data.frame(a,x,y)

RTable[,4] = c(0,RTable[-nrow(RTable),3])  # Delete last value in column and add one to the beginning
# ifelse(RTable$col2 != "STRT", RTable$col3, RTable$col4)

我不知道您数据的限制,但这是一个选项。