我正在尝试将值从一行复制到相应列中另一个具有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
}
你如何为此编写更有效的代码?
答案 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。