2015-10-18 49 views
1

这是一个问题,我遇到了一些调查后续数据,并且痛苦地做了这个手动。在R中必须有一个很好的方法来做到这一点,但我只是没有找到解决这个问题的解决方案。 具体而言,我有一个data.frame,其中同一个人被要求提供一个基线值,然后是一个感兴趣的变量的后续值。如果我想向下游进行配对分析,我只能用这些人对他们来说,我有完整的数据都 一)基线 二)后续如何识别R中的一个data.frame中的缺失对?

下面是一些样本数据

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 <- 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 

我失去了所有对他们来说,我可能已经与问候信息不完全在一个地方的人,例如鼠标有完整的数据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 

注意,我真正的数据有一种情况,“彼得”有4个基线和后续测量,“潘”有6基线和后续测量等

对不起,是一个麻烦并且如评论中所写,当然已经接受了答复。但是如果你有一个想法如何解决这个问题,那将是非常棒的!谢谢。

回答

3

你可以尝试dplyr方法:

library(dplyr) 
df %>% group_by(a) %>% 
     filter(!any(is.na(c))) 

这将启动c列中有任何NAs的任何组(您的a)。

对于新的数据,除非我已经读错,你只是想按现在(a, d)

df %>% group_by(a, d) %>% 
     filter(!any(is.na(c))) 
+1

优雅。 +1这个过滤器全部。谢谢! –

+0

首先,谢谢你为你的速度和优雅回复!我愚蠢的是不先想到dplyr方法!我会接受这两个答复,因为他们是我的问题的答案。我真正的DF是有问题的,因为数据是长格式的,同一时间点的同一个变量的多个值被调查。所以过滤必须更适合每个人。我会用df更新这个问题,以说明我的真实数据存在的问题。但是,谢谢你们两位! – OFish

+0

我认为答案只适用于group_by a和d?看到编辑 – jeremycg

3

EDITED

为了您的新的问题,这样的事情

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