我有一个这样的数据框
x <- c(1, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0)
y <- c(10:20)
dat <- rbind(x, y)
我不希望X行包含0。相反,我想用最近的非零列中的值替换0。
预期输出为
1 1 1 1 2 2 2 3 3 3 3
10 11 12 13 14 15 16 17 18 19 20
这类似于找到的here解决方案,但是按列而不是按行操作。
谢谢!
答案 0 :(得分:3)
步骤1:用NA
替换所有零,因为...
dat[1, dat[1,] == 0] <- NA
步骤2: ...,然后可以使用esp函数。旨在根据NA
值
dat[1, ] <- zoo::na.locf(unlist(dat[1,]))
# dat[1, ] <- zoo::na.locf(dat[1, ])
结果:
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
#x 1 1 1 1 2 2 2 3 3 3 3
#y 10 11 12 13 14 15 16 17 18 19 20
由于您的示例是matrix
,因此您的真实数据可能有data.frame
。确保将{.1行} data.frame行插入向量中,以便?unlist
可以按需运行。
答案 1 :(得分:2)
这是tidyverse
的一个选项,我们在其中转置数据,并在所有列上使用fill
,然后将其转回
library(tidyverse)
dat %>%
t %>%
as.data.frame %>%
na_if(., 0) %>%
fill(!!! rlang::syms(names(.))) %>%
t