我不知道如何简单地将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)
我不知道如何mutate()
df$x
并将每个字符复制/填充到2
行,以实现这个新的df
:
有什么好方法?有dplyr
方式吗?
答案 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)