您如何识别 R 中一个 data.frame 中的缺失对?
How do you identify missing pairs within one data.frame in R?
这是我在一些调查的后续数据中遇到的问题,并且一直在痛苦地手动执行此操作。在 R 中一定有一种优雅的方法可以做到这一点,但我还没有在任何地方找到解决这个问题的方法。
具体来说,我有一个 data.frame
,要求同一个人提供基线值,然后提供感兴趣变量的后续值。如果我想在下游进行配对分析,我只能使用我对两者都有完整数据的那些人
一)基线
b) 跟进
这是一些样本数据
a <- rep(c("Peter", "Pan", "Mickey", "Mouse"), times = 1, each = 2)
b <- rep(c("Baseline", "Follow-up"), times = 4)
c <- c(6, 1, 6, 3, 7, 3, NA, 1)
df <- data.frame(a, b, c)
df
a b c
1 Peter Baseline 6
2 Peter Follow-up 1
3 Pan Baseline 6
4 Pan Follow-up 3
5 Mickey Baseline 7
6 Mickey Follow-up 3
7 Mouse Baseline NA
8 Mouse Follow-up 1
正如我们所见,Mouse 缺少基线信息,因此不能包含在配对分析中。
df2 <- df[complete.cases(df),]
# OR
df2 <- na.omit(df) # both produce the same result
df2
a b c
1 Peter Baseline 6
2 Peter Follow-up 1
3 Pan Baseline 6
4 Pan Follow-up 3
5 Mickey Baseline 7
6 Mickey Follow-up 3
8 Mouse Follow-up 1
在这种情况下没有帮助,因为它们保留了鼠标的后续值,而我只想对我有完整数据的个人进行进一步分析,否则我可能会包含不完整的数据从而伪造我的下游分析。
如果有人对如何
a) 识别缺失感兴趣变量数据的个体,以及
b) 如何随后删除那个人的所有数据,那太棒了。
谢谢。
根据出色的初始答案进行更新。
我处理的真实数据不像示例数据那样"symmetrical",我遇到了以下问题。
a <- rep(c("Peter", "Pan", "Mickey", "Mouse"), times = 1, each = 4)
b <- rep(c("Baseline", "Follow-up"), times = 4, each = 2)
c <- rep(c(6, 6, 1, 1, 7, 7, 3, 2, NA, 9, 1, 1, 7, 7, NA, 2))
d <- rep(c("Arm", "Leg"), times = 8, each = 1)
df <- data.frame(a, b, c, d)
因此,正如您所见,针对同一变量 c,针对不同位置(此处为任意手臂和腿)对个体进行了调查。
如果我现在应用提供的解决方案:
df %>% group_by(a) %>% filter(all(!is.na(c)))
Source: local data frame [8 x 4]
Groups: a
a b c d
1 Peter Baseline 6 Arm
2 Peter Baseline 6 Leg
3 Peter Follow-up 1 Arm
4 Peter Follow-up 1 Leg
5 Pan Baseline 7 Arm
6 Pan Baseline 7 Leg
7 Pan Follow-up 3 Arm
8 Pan Follow-up 2 Leg
我失去了所有我可能没有关于一个位置的不完整信息的人,例如Mouse 具有 df$d == "Leg"
的完整数据,因此我可以在下游使用它。
如果我应用 Paulo 的解决方案 - 我得到一个不完整的数据框,因为例如鼠标的两个基线测量值都被保留了。
df %>%
filter(complete.cases(.))%>%
group_by(a)%>%
mutate(n=length(c))%>%
filter(n>1)
Source: local data frame [14 x 5]
Groups: a
a b c d n
1 Peter Baseline 6 Arm 4
2 Peter Baseline 6 Leg 4
3 Peter Follow-up 1 Arm 4
4 Peter Follow-up 1 Leg 4
5 Pan Baseline 7 Arm 4
6 Pan Baseline 7 Leg 4
7 Pan Follow-up 3 Arm 4
8 Pan Follow-up 2 Leg 4
9 Mickey Baseline 9 Leg 3
10 Mickey Follow-up 1 Arm 3
11 Mickey Follow-up 1 Leg 3
12 Mouse Baseline 7 Arm 3
13 Mouse Baseline 7 Leg 3
14 Mouse Follow-up 2 Leg 3
注意,我的真实数据有这样一种情况:"Peter" 有 4 个基线和后续测量,"Pan" 有 6 个基线和后续测量等。
抱歉打扰了,如评论中所写,回复当然已被接受。但是,如果您知道如何解决这个问题,那就太棒了!谢谢。
已编辑
对于你的新问题,类似这样
library(dplyr)
df%>%
filter(complete.cases(.))%>%
group_by(a, d)%>%
mutate(n=length(c))%>%
filter(n>1)%>%select(-n)
会给你这个
Source: local data frame [12 x 4]
Groups: a, d
a b c d
1 Peter Baseline 6 Arm
2 Peter Baseline 6 Leg
3 Peter Follow-up 1 Arm
4 Peter Follow-up 1 Leg
5 Pan Baseline 7 Arm
6 Pan Baseline 7 Leg
7 Pan Follow-up 3 Arm
8 Pan Follow-up 2 Leg
9 Mickey Baseline 9 Leg
10 Mickey Follow-up 1 Leg
11 Mouse Baseline 7 Leg
12 Mouse Follow-up 2 Leg
您可以尝试 dplyr
方法:
library(dplyr)
df %>% group_by(a) %>%
filter(!any(is.na(c)))
这将踢出在 c 列中有任何 NA 的任何组(您的 a)。
对于新数据,除非我读错了你现在只想按 (a, d)
分组:
df %>% group_by(a, d) %>%
filter(!any(is.na(c)))
这是我在一些调查的后续数据中遇到的问题,并且一直在痛苦地手动执行此操作。在 R 中一定有一种优雅的方法可以做到这一点,但我还没有在任何地方找到解决这个问题的方法。
具体来说,我有一个 data.frame
,要求同一个人提供基线值,然后提供感兴趣变量的后续值。如果我想在下游进行配对分析,我只能使用我对两者都有完整数据的那些人
一)基线
b) 跟进
这是一些样本数据
a <- rep(c("Peter", "Pan", "Mickey", "Mouse"), times = 1, each = 2)
b <- rep(c("Baseline", "Follow-up"), times = 4)
c <- c(6, 1, 6, 3, 7, 3, NA, 1)
df <- data.frame(a, b, c)
df
a b c
1 Peter Baseline 6
2 Peter Follow-up 1
3 Pan Baseline 6
4 Pan Follow-up 3
5 Mickey Baseline 7
6 Mickey Follow-up 3
7 Mouse Baseline NA
8 Mouse Follow-up 1
正如我们所见,Mouse 缺少基线信息,因此不能包含在配对分析中。
df2 <- df[complete.cases(df),]
# OR
df2 <- na.omit(df) # both produce the same result
df2
a b c
1 Peter Baseline 6
2 Peter Follow-up 1
3 Pan Baseline 6
4 Pan Follow-up 3
5 Mickey Baseline 7
6 Mickey Follow-up 3
8 Mouse Follow-up 1
在这种情况下没有帮助,因为它们保留了鼠标的后续值,而我只想对我有完整数据的个人进行进一步分析,否则我可能会包含不完整的数据从而伪造我的下游分析。
如果有人对如何 a) 识别缺失感兴趣变量数据的个体,以及 b) 如何随后删除那个人的所有数据,那太棒了。
谢谢。
根据出色的初始答案进行更新。
我处理的真实数据不像示例数据那样"symmetrical",我遇到了以下问题。
a <- rep(c("Peter", "Pan", "Mickey", "Mouse"), times = 1, each = 4)
b <- rep(c("Baseline", "Follow-up"), times = 4, each = 2)
c <- rep(c(6, 6, 1, 1, 7, 7, 3, 2, NA, 9, 1, 1, 7, 7, NA, 2))
d <- rep(c("Arm", "Leg"), times = 8, each = 1)
df <- data.frame(a, b, c, d)
因此,正如您所见,针对同一变量 c,针对不同位置(此处为任意手臂和腿)对个体进行了调查。
如果我现在应用提供的解决方案:
df %>% group_by(a) %>% filter(all(!is.na(c)))
Source: local data frame [8 x 4]
Groups: a
a b c d
1 Peter Baseline 6 Arm
2 Peter Baseline 6 Leg
3 Peter Follow-up 1 Arm
4 Peter Follow-up 1 Leg
5 Pan Baseline 7 Arm
6 Pan Baseline 7 Leg
7 Pan Follow-up 3 Arm
8 Pan Follow-up 2 Leg
我失去了所有我可能没有关于一个位置的不完整信息的人,例如Mouse 具有 df$d == "Leg"
的完整数据,因此我可以在下游使用它。
如果我应用 Paulo 的解决方案 - 我得到一个不完整的数据框,因为例如鼠标的两个基线测量值都被保留了。
df %>%
filter(complete.cases(.))%>%
group_by(a)%>%
mutate(n=length(c))%>%
filter(n>1)
Source: local data frame [14 x 5]
Groups: a
a b c d n
1 Peter Baseline 6 Arm 4
2 Peter Baseline 6 Leg 4
3 Peter Follow-up 1 Arm 4
4 Peter Follow-up 1 Leg 4
5 Pan Baseline 7 Arm 4
6 Pan Baseline 7 Leg 4
7 Pan Follow-up 3 Arm 4
8 Pan Follow-up 2 Leg 4
9 Mickey Baseline 9 Leg 3
10 Mickey Follow-up 1 Arm 3
11 Mickey Follow-up 1 Leg 3
12 Mouse Baseline 7 Arm 3
13 Mouse Baseline 7 Leg 3
14 Mouse Follow-up 2 Leg 3
注意,我的真实数据有这样一种情况:"Peter" 有 4 个基线和后续测量,"Pan" 有 6 个基线和后续测量等。
抱歉打扰了,如评论中所写,回复当然已被接受。但是,如果您知道如何解决这个问题,那就太棒了!谢谢。
已编辑
对于你的新问题,类似这样
library(dplyr)
df%>%
filter(complete.cases(.))%>%
group_by(a, d)%>%
mutate(n=length(c))%>%
filter(n>1)%>%select(-n)
会给你这个
Source: local data frame [12 x 4]
Groups: a, d
a b c d
1 Peter Baseline 6 Arm
2 Peter Baseline 6 Leg
3 Peter Follow-up 1 Arm
4 Peter Follow-up 1 Leg
5 Pan Baseline 7 Arm
6 Pan Baseline 7 Leg
7 Pan Follow-up 3 Arm
8 Pan Follow-up 2 Leg
9 Mickey Baseline 9 Leg
10 Mickey Follow-up 1 Leg
11 Mouse Baseline 7 Leg
12 Mouse Follow-up 2 Leg
您可以尝试 dplyr
方法:
library(dplyr)
df %>% group_by(a) %>%
filter(!any(is.na(c)))
这将踢出在 c 列中有任何 NA 的任何组(您的 a)。
对于新数据,除非我读错了你现在只想按 (a, d)
分组:
df %>% group_by(a, d) %>%
filter(!any(is.na(c)))