【问题标题】:Replicate rows with missing values and replace missing values by vector复制具有缺失值的行并用向量替换缺失值
【发布时间】:2018-03-01 09:24:23
【问题描述】:

我有一个数据框,其中的一列有一些缺失值。 我想将缺失值的行复制 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


    【解决方案1】:

    您可以尝试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
    

    这个想法是用,-collapsed 'replace_values' 替换NA's。然后使用tidyrseparate_rows 函数分离合并的值并逐行绑定它们。最后根据您的预期输出对data.frame 进行排序。

    【讨论】:

      【解决方案2】:

      我们可以在这里使用base R 进行rbind。创建一个逻辑向量,其中“值”为 NA(“i1”),通过获取它的 sum(“n”)获取 NA 元素的数量,通过 replicating 'replace_values 创建一个 data.frame '带有'n'以及'replace_values'的length对应于'value'的NA元素的'result'元素和'rbind'与数据集的子集,即'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
      

      【讨论】:

        猜你喜欢
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-15
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多