将一行中的值复制到R中的另一行

Copying values in one row to another in R

我正在尝试将值从一行复制到相应列中值为 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
}

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

根据条件,循环遍历列,得到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

注意:每列第4行后的NA

时的条件不清楚

如果你想使用 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。