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

时间:2018-02-07 16:49:28

标签: r loops row copying

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

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

2 个答案:

答案 0 :(得分:3)

根据条件,遍历列,根据' i1&#39获取NA元素的索引(' i1')和replace列的值;使用添加索引的列的值为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值的条件不清楚

答案 1 :(得分:3)

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