复制具有缺失值的行并使用向量替换缺失值

问题描述 投票:1回答:2

我有一个数据框,其中一列有一些缺失值。我想复制缺少值N次的行,其中N是包含缺失值替换的向量的长度。

我首先定义一个替换向量,然后是我的起始data.frame,然后是我想要的结果,最后我尝试解决它。不幸的是,这不起作用......

> replace_values <- c('A', 'B', 'C')
> data.frame(value = c(3, 4, NA, NA), result = c(5, 3, 1,2))
  value result
1     3      5
2     4      3
3    NA      1
4    NA      2
> data.frame(value = c(3, 4, replace_values, replace_values), result = c(5, 3, rep(1, 3),rep(2, 3)))
  value result
1     3      5
2     4      3
3     A      1
4     B      1
5     C      1
6     A      2
7     B      2
8     C      2
> t <- data.frame(value = c(3, 4, NA, NA), result = c(5, 3, 1,2))
> mutate(t, value = ifelse(is.na(value), replace_values, value))
  value result
1     3      5
2     4      3
3     C      1
4     A      2
r dataframe replace row replicate
2个回答
2
投票

你可以尝试一下tidyverse解决方案

d %>% 
  mutate(value=ifelse(is.na(value), paste0(replace_values, collapse=","), value)) %>% 
  separate_rows(value, sep=",") %>% 
  select(value, everything())
  value result
1     3      5
2     4      3
3     A      1
4     B      1
5     C      1
6     A      2
7     B      2
8     C      2

这个想法是用NA-collapse'replace_values'取代,。然后将collpased值分开并使用tidyrseparate_rows函数按行绑定它们。最后根据您的预期输出对data.frame进行排序。


1
投票

我们可以使用rbind在这里做一个base R。创建一个逻辑向量,其中'value'是NA('i1'),通过获取它的sum('n')得到NA元素的数量,通过data.framelicating'replace_values'和'n'创建一个rep作为“结果”元素,对应于'replace_values'和'rbind'的length的'value'的NA元素与数据集的子集,即'value'行的非NA元素

i1 <- is.na(df1$value)
n <- sum(i1)
rbind(df1[!i1,], 
   data.frame(value = rep(replace_values, n), 
    result = rep(df1$result[i1], each = length(replace_values))))
#   value result
#1     3      5
#2     4      3
#3     A      1
#4     B      1
#5     C      1
#6     A      2
#7     B      2
#8     C      2
© www.soinside.com 2019 - 2024. All rights reserved.