2015-10-18 45 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