用 R 中该行的最新非 NA 值替换特定列中的 NA
Replacing NA from a specific column with latest non-NA value from that row in R
我有一个看起来像这样的大数据框
library(tidyverse)
df <- tibble(fruits=c("apple","banana","ananas"),
col1=c(4,NA,NA),
col2=c(5,NA,10),
col3=c(10,100,5),
col4=c(20,4,1))
df
#> # A tibble: 3 × 5
#> fruits col1 col2 col3 col4
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 apple 4 5 10 20
#> 2 banana NA NA 100 4
#> 3 ananas NA 10 5 1
由 reprex package (v2.0.1)
于 2022-03-13 创建
当只有 col1 有一个 NA 值时,我想用该行的最后一个非 NA 值填充 NA,并且 return 将该值填充为 NA。
我希望我的数据看起来像这样。
#> # A tibble: 3 × 5
#> fruits col1 col2 col3 col4
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 apple 4 5 10 20
#> 2 banana 100 NA NA 4
#> 3 ananas 10 NA 5 1
如果它很大 data.frame,使用矢量化解决方案而不是遍历行可能更有效。获取'col1'中为NA
('i1')元素的逻辑索引,使用max.col
到returnfirst
的列索引non-NA 从第 3 列到第 5 列的元素 ('j1'),用 cbind
创建一个 row/column 索引矩阵 (m1
),分配 'col1' 其中有使用 'm1' 从 3 到 5 列中提取元素的缺失值,并将这些元素分配给 NA
df1 <- as.data.frame(df)
i1 <- is.na(df1$col1)
j1 <- max.col(!is.na(df1[3:5]), "first")
m1 <- cbind(which(i1), j1[i1])
df1$col1[i1] <- df1[3:5][m1]
df1[3:5][m1] <- NA
-输出
> df1
fruits col1 col2 col3 col4
1 apple 4 5 10 20
2 banana 100 NA NA 4
3 ananas 10 NA 5 1
我有一个看起来像这样的大数据框
library(tidyverse)
df <- tibble(fruits=c("apple","banana","ananas"),
col1=c(4,NA,NA),
col2=c(5,NA,10),
col3=c(10,100,5),
col4=c(20,4,1))
df
#> # A tibble: 3 × 5
#> fruits col1 col2 col3 col4
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 apple 4 5 10 20
#> 2 banana NA NA 100 4
#> 3 ananas NA 10 5 1
由 reprex package (v2.0.1)
于 2022-03-13 创建当只有 col1 有一个 NA 值时,我想用该行的最后一个非 NA 值填充 NA,并且 return 将该值填充为 NA。
我希望我的数据看起来像这样。
#> # A tibble: 3 × 5
#> fruits col1 col2 col3 col4
#> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 apple 4 5 10 20
#> 2 banana 100 NA NA 4
#> 3 ananas 10 NA 5 1
如果它很大 data.frame,使用矢量化解决方案而不是遍历行可能更有效。获取'col1'中为NA
('i1')元素的逻辑索引,使用max.col
到returnfirst
的列索引non-NA 从第 3 列到第 5 列的元素 ('j1'),用 cbind
创建一个 row/column 索引矩阵 (m1
),分配 'col1' 其中有使用 'm1' 从 3 到 5 列中提取元素的缺失值,并将这些元素分配给 NA
df1 <- as.data.frame(df)
i1 <- is.na(df1$col1)
j1 <- max.col(!is.na(df1[3:5]), "first")
m1 <- cbind(which(i1), j1[i1])
df1$col1[i1] <- df1[3:5][m1]
df1[3:5][m1] <- NA
-输出
> df1
fruits col1 col2 col3 col4
1 apple 4 5 10 20
2 banana 100 NA NA 4
3 ananas 10 NA 5 1