首页 > 解决方案 > 找出每个 id 是否有任何非 NA 值

问题描述

在下面的长格式数据框中(即每个测量点一行),我想找出哪个人(变量ID )在Var1Var2上都只有 NA ,而哪个人至少有一个非 NA 值Var1Var2。_ 那些只有 NA 值的应该在第 0 组,那些至少有一个非 NA 值的应该在第 1 组。

df <- read.table(text=
"ID       Var1   Var2      
800057    NA    NA               
800057    NA    NA           
800057    NA    NA          
800057    NA    1         
800057    NA    NA 
800119    NA    NA 
800119    NA    NA          
800119    NA    NA      
834011     1    NA
834011     3    NA  
834341    NA    NA
834341    5     NA  
834341    NA    NA   
834341    NA    NA   
834341    3     NA", header=TRUE)

我的结果将如下所示:

df <- read.table(text=
"ID       Var1  Var2  Group    
800057    NA    NA   1            
800057    NA    NA   1        
800057    NA    NA   1       
800057    NA    1    1     
800057    NA    NA   1
800119    NA    NA   0
800119    NA    NA   0       
800119    NA    NA   0   
834011     1    NA   1
834011     3    NA   1
834341    NA    NA   1
834341    5     NA   1   
834341    NA    NA   1
834341    NA    2    1
834341    3     NA   1", header=TRUE)

我想尝试使用group_by(ID)mutate()创建 Group 变量的解决方案。

标签: rdataframedplyrgrouping

解决方案


您可以使用 all

library(dplyr)
df %>%
  group_by(ID) %>%
  mutate(Group = as.integer(!all(is.na(Var1) & is.na(Var2))))

#       ID  Var1  Var2 Group
#    <int> <int> <int> <int>
# 1 800057    NA    NA     1
# 2 800057    NA    NA     1
# 3 800057    NA    NA     1
# 4 800057    NA     1     1
# 5 800057    NA    NA     1
# 6 800119    NA    NA     0
# 7 800119    NA    NA     0
# 8 800119    NA    NA     0
# 9 834011     1    NA     1
#10 834011     3    NA     1
#11 834341    NA    NA     1
#12 834341     5    NA     1
#13 834341    NA    NA     1
#14 834341    NA    NA     1
#15 834341     3    NA     1

或者可以更改最后一行以使用any

mutate(Group = as.integer(any(!is.na(Var1) | !is.na(Var2))))

推荐阅读