尝试提高使用R

时间:2016-04-16 23:46:53

标签: r dataframe

我正在寻找一种有效的方式来打开这样的数据框:

1 45
2 49
5 25
6 24
9 32
11 39

进入这样的数据框:

1 45
2 49
3 49
4 49
5 25
6 24
7 24
8 24
9 32
10 32
11 39

因此,这基本上是为左列中的序列中的缺失值添加行,并使用右列的最后一个值。我正在尝试为1,000,000行的数据框执行此操作,而且我的功能非常慢。我认为必须有一个更快的方法。

我这样做的方法是首先把它放到data.frame中我打电话给w

1 45
2 49
3 0
4 0
5 25
6 24
7 0
8 0
9 32
10 0
11 39

这个步骤非常快,不是问题,但后来我使用:

for (i in 1:nrow(w)) {
  if(w[i,2]==0) {w[i,2]<-w[i-1,2]}
}

大部分时间花在'&lt; - '上,但我尝试了很多不同的方法,这是我能想到的最快的方法。当我做20,000行时它很快,但当我尝试1,000,000行时,它需要大约30分钟。

有没有人有任何想法?

3 个答案:

答案 0 :(得分:2)

使用第一列中每个值之间的diffrep吃每一行:

out <- dat[rep(rownames(dat), c(diff(dat$V1), 1)),]
out$V1 <- seq_len(nrow(out))
out

#    V1 V2
#1    1 45
#2    2 49
#2.1  3 49
#2.2  4 49
#3    5 25
#4    6 24
#4.1  7 24
#4.2  8 24
#5    9 32
#5.1 10 32
#6   11 39

dat的位置:

dat <- structure(list(V1 = c(1L, 2L, 5L, 6L, 9L, 11L), V2 = c(45L, 49L,
25L, 24L, 32L, 39L)), .Names = c("V1", "V2"), class = "data.frame",
row.names = c(NA,-6L))

答案 1 :(得分:0)

以下是04-16 21:43:54.597 13522-13522/co.edu.javeriana.faros D/RoutinesViewAdapter: position: 0 holder: ViewHolder{883eb98 position=0 id=-1, oldPos=-1, pLpos:-1 no parent} show?: true 04-16 21:43:54.862 13522-13522/co.edu.javeriana.faros D/RoutinesViewAdapter: position: 0 holder: ViewHolder{263b1503 position=0 id=-1, oldPos=-1, pLpos:-1 scrap [changeScrap] tmpDetached not recyclable(1) no parent} show?: true 04-16 21:43:55.387 13522-13522/co.edu.javeriana.faros D/RoutinesViewAdapter: position: 0 holder: ViewHolder{883eb98 position=0 id=-1, oldPos=-1, pLpos:-1 no parent} show?: true 04-16 21:43:55.668 13522-13522/co.edu.javeriana.faros D/RoutinesViewAdapter: position: 0 holder: ViewHolder{263b1503 position=0 id=-1, oldPos=-1, pLpos:-1 scrap [changeScrap] tmpDetached not recyclable(1) no parent} show?: true 04-16 21:43:55.949 13522-13522/co.edu.javeriana.faros D/RoutinesViewAdapter: position: 0 holder: ViewHolder{883eb98 position=0 id=-1, oldPos=-1, pLpos:-1 no parent} show?: true 04-16 21:43:56.189 13522-13522/co.edu.javeriana.faros D/RoutinesViewAdapter: position: 0 holder: ViewHolder{263b1503 position=0 id=-1, oldPos=-1, pLpos:-1 scrap [changeScrap] tmpDetached not recyclable(1) no parent} show?: true 04-16 21:43:56.479 13522-13522/co.edu.javeriana.faros D/RoutinesViewAdapter: position: 0 holder: ViewHolder{883eb98 position=0 id=-1, oldPos=-1, pLpos:-1 no parent} show?: true expand.grid

的另一个选项
na.locf

答案 2 :(得分:0)

以下是使用tidyr包的另一种解决方案:

library(tidyr)
dat %>%
  complete(V1 = full_seq(V1, 1)) %>%
  fill(V2)