将特定值替换为上一行中的值

时间:2019-06-20 05:09:53

标签: r tidyverse

我有一个大表,其中有几列,其中包含“-”。我想用同一列中上一行的值替换“-”

library(tidyverse)

# This is the df I have
df <- data.frame(stringsAsFactors=FALSE,
                my = c("a", "a", "a", "-", "b", "b", "b", "-", "c", "c", "c", "-"),
               bad = c("d", "d", "d", "-", "e", "e", "e", "-", "f", "f", "f", "-"),
             table = c("g", "g", "g", "-", "h", "h", "h", "-", "i", "i", "i", "-")
      )

# This is the desired output:
output_df <- data.frame(stringsAsFactors=FALSE,
                       my = c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c"),
                      bad = c("d", "d", "d", "d", "e", "e", "e", "e", "f", "f", "f", "f"),
                    table = c("g", "g", "g", "g", "h", "h", "h", "h", "i", "i", "i", "i")
             )


# What I have tried unsuccessfully:

df %>% 
  mutate_at(c("my", "bad", "table"), .funs = str_replace("-", NA))

我对这个想法有些困惑。.....有什么想法吗?

1 个答案:

答案 0 :(得分:3)

fill更改为-后,选项为NA

library(tidyverse)
df %>% 
   mutate_all(na_if, "-") %>% 
   fill(my, bad, table)
   # orif there are many columns
   # fill(!!! rlang::syms(names(.)))
   # or as H1 suggested
   # fill(everything())
#   my bad table
#1   a   d     g
#2   a   d     g
#3   a   d     g
#4   a   d     g
#5   b   e     h
#6   b   e     h
#7   b   e     h
#8   b   e     h
#9   c   f     i
#10  c   f     i
#11  c   f     i
#12  c   f     i