【发布时间】:2018-12-17 09:16:19
【问题描述】:
嘿,我需要填写数据框的缺失值。逻辑很简单,如果M[i, j + 1] 中有值,则使用M[i, j + 1],否则使用M[i, j - 1]。但棘手的是我需要填写从行开始到每行最后一个非 na 值之后的列的缺失值,而不仅仅是非空单元格附近的单元格。
这是数据
a1 <- c('a',9,8,rep(NA,5))
a2 <- c('b',NA,NA,NA,NA,3,NA,4)
a3 <- c('c',11,6,7,NA,NA,NA,6)
M <- rbind(a1,a2,a3)
ind <- !is.na(M[,-1])
t <- tapply(M[,-1][ind], row(M[,-1])[ind], head, 1)
M <- M %>%
as.data.frame(stringsAsFactors = FALSE) %>%
group_by(V1) %>%
do(mutate(., last_non_na_col = max(apply(.,1,function(x) max(which(!is.na(x)))))))
for (i in 1:nrow(M)) {
for (j in 3:(M$last_non_na_col[i]+1)) {
if (is.na(M[i,j])) {
M[i,j] = ifelse(!is.na(M[i,j+1]),M[i,j+1],(ifelse(!is.na(M[i,j-1]),M[i,j-1],t[i])))
} }
for (j in 2) { M[i,j] = ifelse(is.na(M[i,j]), M[i,j+1], M[i,j])}
}
原始数据是这样的
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
a1 "a" "9" "8" NA NA NA NA NA
a2 "b" NA NA NA NA "3" NA "4"
a3 "c" "11" "6" "7" NA NA NA "6"
我的代码输出如下,是正确的。请注意,对于单元格 M[2,5],填充的值应该是 7(它之前的数字),而不是 6(它之后最接近的数字)。
V1 V2 V3 V4 V5 V6 V7 V8 last_non_na_col
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <int>
1 a 9 8 8 NA NA NA NA 3
2 b 3 3 3 3 3 4 4 8
3 c 11 6 7 7 7 6 6 8
我在 for 循环中做了这个。有没有人可以帮助我在 tidyverse 中做到这一点?
谢谢,
凯茜
【问题讨论】:
-
您创建了所有列作为字符的数据。这是你的意图吗?
-
不,那不是。但我认为这不会影响结果,对吧?
-
不会,但我很好奇你是否知道原因
-
我知道原因,但我还没有弄清楚如何解决它。在for循环中,它会遍历每个i,然后遍历每个j,所以如果M[2,5]的值发生变化,它不会再次改变M[2,3]的值,因为循环已经通过了M[2 ,3]。但是我想要的是在 M[2,5] 改变之后, M[2,3] 在那之后改变。我可能需要尝试申请...
标签: r dplyr na missing-data tidyr