![](/img/trans.png)
[英]Fill empty cells between two values in column with last non empty cell and next non empty cell in R
[英]R: Fill empty cell with value of last non-empty cell
在Excel中,很容易在一列内抓取一个单元格,然后将cursor向下拖动,替换下面的许多单元格,使每个单元格都变成与原来相同的值。
这个 function 可以使用 for 循环在 R 中执行。 我今天花了一些时间试图弄清楚,并认为我会为了下一个站在我这边的人的利益而分享:
for (row in 2:length(data$column)){ # 2 so you don't affect column names
if(data$column[row] == "") { # if its empty...
data$column[row] = data$column[row-1] # ...replace with previous row's value
}
}
这对我有用,尽管运行一个巨大的数据文件需要很长时间(5-10 分钟)。 也许有更有效的方法来实现这个 function,我鼓励任何人说出如何做到这一点。
谢谢,祝你好运。
df <- data.frame(a = c(1:5, "", 3, "", "", "", 4), stringsAsFactors = FALSE)
> df
a
1 1
2 2
3 3
4 4
5 5
6
7 3
8
9
10
11 4
while(length(ind <- which(df$a == "")) > 0){
df$a[ind] <- df$a[ind -1]
}
> df
a
1 1
2 2
3 3
4 4
5 5
6 5
7 3
8 3
9 3
10 3
11 4
编辑:添加时间档案
set.seed(1)
N = 1e6
df <- data.frame(a = sample(c("",1,2),size=N,replace=TRUE),
stringsAsFactors = FALSE)
if(df$a[1] == "") {df$a[1] <- NA}
system.time(
while(length(ind <- which(df$a == "")) > 0){
df$a[ind] <- df$a[ind - 1]
}, gcFirst = TRUE)
user system elapsed
0.89 0.00 0.88
这里使用快速的解决方案na.locf
从zoo
内应用包data.table
。 我在结果中创建了一个新的列y ,以更好地可视化替换缺失值的效果(这里很容易重新生成x列)。 由于na.locf
替换了缺失值,因此需要额外的步骤来用NA
替换所有零长度值。 该解决方案是非常快,只需不到半秒钟在我的机器为1E6行。
library(data.table)
library(zoo)
N=1e6 ## number of rows
DT <- data.table(x=sample(c("",1,2),size=N,replace=TRUE))
system.time(DT[!nzchar(x),x:=NA][,y:=na.locf(x)])
## user system elapsed
## 0.59 0.30 1.78
# x y
# 1: 2 2
# 2: NA 2
# 3: NA 2
# 4: 1 1
# 5: 1 1
# ---
# 999996: 1 1
# 999997: 2 2
# 999998: 2 2
# 999999: NA 2
# 1000000: NA 2
借用agstudy的MWE:
library(dplyr)
library(zoo)
N = 1e6
df <- data.frame(x = sample(c(NA,"A","B"), size=N, replace=TRUE))
system.time(test <- df %>% dplyr::do(zoo::na.locf(.)))
user system elapsed
0.082 0.000 0.130
只是为了提供更新;
tidyr::fill() 比闪电还快
library(dplyr)
library(tidyr)
N = 1e6
df <- data.frame(x = sample(c(NA,"A","B"), size=N, replace=TRUE))
system.time(test <- df %>% tidyr::fill(x))
user system elapsed
0.01 0.00 0.02
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.