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