跨列填充data.frame中的缺失值

时间:2019-02-08 23:09:35

标签: r tidyr

通常,人们希望在列的上下填充缺失值。我想填写左右或左右。

# 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

2 个答案:

答案 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创建