在R中迭代地替换多个NA列

lymnna71  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(123)

我有一个R tibble df

df

id        gender        age
1         M             young
1         M             middle
1         M             old
1         F             young
1         F             middle
1         F             old
2         M             young
...
4         NA            NA
5         NA            NA
6         M             young
...

对于每个idgenderMF组成,而ageyoungmiddleold组成。换句话说,每个id应该有六个不同的条目。有些idNA在随后的两列中。
我的目标是将genderage中的所有NA填充到上述6个组合中。
例如,id == 4id == 5当前都有一行NA s,但我希望id s都有6行genderage组合,类似于id == 1
我熟悉执行迭代的tidyr::crossing,也熟悉mutate_at(..., ~ replace_na),但是在我的管道中应用它们中的任何一个都没有返回我想要的结果。
任何见解赞赏。

s1ag04yj

s1ag04yj1#

您可以将completenesting一起使用,并删除NA行,如下所示:

library(dplyr)
library(tidyr)
df %>%
  complete(id, nesting(gender, age)) %>%
  drop_na(gender, age)
#> # A tibble: 30 × 3
#>       id gender age   
#>    <int> <chr>  <chr> 
#>  1     1 F      middle
#>  2     1 F      old   
#>  3     1 F      young 
#>  4     1 M      middle
#>  5     1 M      old   
#>  6     1 M      young 
#>  7     2 F      middle
#>  8     2 F      old   
#>  9     2 F      young 
#> 10     2 M      middle
#> # … with 20 more rows

创建于2023-03-23带有reprex v2.0.2

使用数据

df = read.table(text = 'id        gender        age
1         M             young
1         M             middle
1         M             old
1         F             young
1         F             middle
1         F             old
2         M             young
4         NA            NA
5         NA            NA
6         M             young', header = TRUE)
vmpqdwk3

vmpqdwk32#

如果你想坚持使用基本的R函数,你可以这样做:
假设这是你的数据:

df<-data.frame(id=c(1,1,1,1,1,1,2,3,4,5,6),
           gender=c("M","M","M","F","F","F","M","M",NA,NA,"M"),
           age=c("young","middle","old","young","young",NA,NA,"young","young","young","young"))

您可以使用expand.grid()unique()来提供所有组合。

df2<-expand.grid(id=unique(df$id),gender=unique(df$gender),age=unique(df$age))

接下来,要清除和删除NA值,可以用途:

df3<-df2[!rowSums(is.na(df2[-1])),]

现在df 3有你正在寻找的!

相关问题