如何复制,或者"填充"在excel中,一个值向上或向下一定数量的行

时间:2018-03-31 03:59:05

标签: r dplyr

我不知道如何简单地将data.frame值向上或向下复制整数。

例如,如果我有此data.frame df

randcol <- c("s","a","m","p","l", "e","d","a","t","a","h","e","l","l","o")
x <- c(NA,NA,"a",NA,NA,NA,NA,"b",NA,NA,NA,"c",NA,NA,NA)
df <- data.frame(randcol, x)

enter image description here

我不知道如何mutate() df$x并将每个字符复制/填充到2行,以实现这个新的df

enter image description here

有什么好方法?有dplyr方式吗?

谢谢你。 戴夫

1 个答案:

答案 0 :(得分:4)

我们使用'x'中的非NA值创建分组变量,然后执行replace

library(dplyr)
df %>%
   group_by(grp = cumsum(!is.na(x))) %>% 
   mutate(x = replace(x, 2:pmin(3,n()), x[1])) %>% 
   ungroup %>% 
   select(-grp)
# A tibble: 15 x 2
#   randcol x     
#   <fctr>  <fctr>
# 1 s       <NA>  
# 2 a       <NA>  
# 3 m       a     
# 4 p       a     
# 5 l       a     
# 6 e       <NA>  
# 7 d       <NA>  
# 8 a       b     
# 9 t       b     
#10 a       b     
#11 h       <NA>  
#12 e       c     
#13 l       c     
#14 l       c     
#15 o       <NA>  

或者另一个选择是首先执行fill,然后在用'x'分组后用NA替换大于3的行号

df %>%
   tidyr::fill(x) %>% 
   group_by(x1 = x) %>% 
   mutate(x = case_when(row_number() >3 ~ NA_character_,
                      TRUE ~ as.character(x))) %>%
   ungroup %>% 
   select(-x1)