通常,人们希望在列的上下填充缺失值。我想填写左右或左右。
# all character data.frame, except 1st column
df <- data.frame(a = 1:4,
b = c('row1', 'row2', 'row3', 'row4'),
c = paste(9:12),
d = paste(13:16))
# remove a few values
df[2,2] <- df[3,3] <- df[4,2] <- NA
> df
a b c d
1 1 row1 9 13
2 2 <NA> 10 14
3 3 row3 <NA> 15
4 4 <NA> 12 16
# fill down. This is straighforward and works as expected.
df%>%fill(names(.), .direction='down')
如何填写?
# this doesn't work
df%>%fill(names(.), direction='right')
如果填充值与缺失值的类型不匹配,我们假设我们强迫character
。但是仅适用于需要强制的列。因此,列a
应该保留在numeric
答案 0 :(得分:1)
这等同于right
变体:
library(tidyverse)
df %>%
rowid_to_column %>%
gather(key, val, -rowid) %>%
arrange(rowid) %>%
fill(val) %>%
spread(key, val) %>% select(-rowid)
基本上,您可以将数据转换为长格式,然后使用fill
。
如果您使用上述代码,则方向down
等效于right
,方向up
等效于左侧。
输出:
a b c d
1 1 row1 9 13
2 2 2 10 14
3 3 row3 row3 15
4 4 4 12 16
此处属性已删除,您需要重新建立所需的列类型。
答案 1 :(得分:0)
此解决方案转置数据帧,填充,然后再次转回。转置将数据帧转换为矩阵,因此需要将其转换回。
df <- data.frame(a = 1:4,
b = c('row1', 'row2', 'row3', 'row4'),
c = paste(9:12),
d = paste(13:16))
# remove a few values
df[2,2] <- df[3,3] <- df[4,2] <- NA
library(tidyverse)
t(df) %>%
as.data.frame %>%
fill(names(.),.direction = "down") %>%
t %>%
as.data.frame
#> a b c d
#> V1 1 row1 9 13
#> V2 2 2 10 14
#> V3 3 row3 row3 15
#> V4 4 4 12 16
由reprex package(v0.2.1.9000)于2019-02-08创建