[英]Find out if there is any non-NA value for each id
在以下长格式数据框中(即,每个测量点一行),我想找出哪个人(变量ID )在Var1和Var2上都只有 NA,哪个人在上至少有一个非 NA 值Var1或Var2 。 那些只有 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 变量的解决方案。
您可以使用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))))
另一个dplyr
解决方案是将NA
行的计数is.na()
与每组中的条目计数n()
。 由于我们有两个变量,因此n()
需要乘以 2。 比较之前的加号+
将布尔值转换为数字值。
library(dplyr)
df %>%
group_by(ID) %>%
mutate(group = +(sum(is.na(Var1), is.na(Var2)) < 2 * n()))
最后一行可以替换为以下内容以避免进行任何比较。
mutate(group = +(as.logical(sum(is.na(Var1), is.na(Var2)) - 2 * n())))
#> # A tibble: 15 x 4
#> # Groups: ID [4]
#> 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
您可以在base
使用一个简单的ifelse()
函数。
df$group <- ifelse(is.na(df$Var1) & is.na(df$Var2), 1, 2)
ID Var1 Var2 group
1 800057 NA NA 1
2 800057 NA NA 1
3 800057 NA NA 1
4 800057 NA 1 2
5 800057 NA NA 1
6 800119 NA NA 1
7 800119 NA NA 1
8 800119 NA NA 1
9 834011 1 NA 2
10 834011 3 NA 2
11 834341 NA NA 1
12 834341 5 NA 2
13 834341 NA NA 1
14 834341 NA NA 1
15 834341 3 NA 2
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.