【问题标题】:Copying values in one row to another in R将一行中的值复制到R中的另一行
【发布时间】:2018-02-07 16:49:28
【问题描述】:

我正在尝试将值从一行复制到对应列中值为 NA 的另一指定行。

在这种情况下——如果第 1 行中的值是 NA,他们应该从第 5 行复制值。如果第 2 行中的值是 NA,他们应该复制第 6 行中的值。

这是示例数据框:

      Name1   Name2   
   1  NA      NA      
   2  4       NA      
   3  5       8         
   4  2       5     
   5  3       6    
   6  4       7  
   7  5       8    

这是预期的输出:

      Name1   Name2   
   1  3       6   
   2  4       7   
   3  5       8         
   4  2       5     
   5  3       6    
   6  4       7  
   7  5       8   

我可以通过为数据框的每个单元格编写一个 if 语句来实现这一点,但这并不理想。 (基于示例数据框——下面的代码基本上必须重复四次。)

例子:

if (is.na(df[1,]$Name1){
     df[1,]$Name1 = df[5,]$Name1
}

您如何为此编写更高效的代码?

【问题讨论】:

    标签: r loops row copying


    【解决方案1】:

    如果你想使用 tidyverse,你可以这样做。

    library(tibble)
    library(dplyr)
    library(magrittr)
    library(purrr)
    
    df <- tibble(Name1 = c(NA, 1:6), Name2 = c(NA, NA, 1:5))
    
    replace_var_lead <- function(var) {
    
      tmp_df <- tibble(rep = lead(var, n = 4),
             var = var) %>% 
        rowwise %>% 
        mutate(var = var %>% replace_na(rep))
    
      return(tmp_df$var)
    }
    
    df %>% 
      map_df(replace_var_lead)
    

    注意:这与使用基数 R 的答案具有相同的弱点。替换也可能是 NA。

    【讨论】:

      【解决方案2】:

      根据条件,循环遍历列,获取NA元素的索引('i1')和replace使用添加索引的列的值基于'i1'的列的值使用 4 并将输出分配回数据集

      df1[] <- lapply(df1, function(x) {
                         i1 <- which(is.na(x))
                         replace(x, i1, x[i1+4])
       })
      df1
      #  Name1 Name2
      #1     3     6
      #2     4     7
      #3     5     8
      #4     2     5
      #5     3     6
      #6     4     7
      #7     5     8
      

      注意:当NA 值在每列第 4 行之后的情况尚不清楚

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2014-06-19
        • 1970-01-01
        • 2017-11-23
        • 2019-05-26
        • 1970-01-01
        相关资源
        最近更新 更多