簡體   English   中英

R、dplyr 中的子集 dataframe 過濾列 A 的行值而不是列 B 的行中的 NA

[英]Subset dataframe in R, dplyr filter row values of column A not NA in row of column B

我有一個由時間序列研究組成的數據集。 由於某些參與者在某些日子沒有出現,因此他們具有數據框 rest 的 NA 值,但某些研究日期至關重要,因此我試圖將我的數據子集給參與者,不要錯過這些關鍵日子。 我的數據集實際上非常大,但這是一般結構:

fakedat <- data.frame(ID = c("A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", 
                          "D", "D", "D", "D", "E", "E", "E", "E", "F", "F", "F", "F"),
                           StudyDay = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 
                                        1, 2, 3, 4),
                           Ab = c(10, NA, 15, 10, 10, 20, 10, NA, 10, 10, NA, 30, NA, NA, 15, NA, 10, 20,
                                  10, 30, NA, 10, NA, 20))

現在假設它們在第 2 天和第 4 天出現至關重要,我嘗試使用 dplyr 過濾進行子集設置,如下所示:

fakedat2 <- fakedat %>%
  dplyr::group_by(ID) %>%
  dplyr::filter(StudyDay %in% c(2, 4) & !is.na(Ab)) %>%
  dplyr:: ungroup()

編輯:但是這個數據集的 output 只是如果 ID 的 2 或 4 不是 NA 值的列表。 我需要找到(在我的真實數據中)在 4 個特定研究日具有 NA Ab 值的受試者。 我在下面接受的答案有效,但仍然對執行條件過濾感到好奇? 就像在 SAS 中一樣,您可以編寫“IF Ab.=NA at (StudyDay=2 AND StudyDay=4) THEN ID....或類似的代碼。

也許這會達到你的目標。 如果所有參與者都有所有StudyDay時間點,並且您只想查看第 2 天或第 4 天是否缺失,您可以在filter中檢查這些時間點的Ab值。 在這種情況下,如果在第 2 天和第 4 天都為NA (在此示例中為“D”),則將省略ID

或者,如果您希望這兩個值在第 2 天和第 4 天都可用,您可以使用& (AND) 而不是| (或者)。

library(dplyr)

fakedat %>%
  group_by(ID) %>%
  filter(!is.na(Ab[StudyDay == 2]) | !is.na(Ab[StudyDay == 4]))

如果您有多個要檢查的天數,您可以使用all並檢查NA的值,其中StudyDay%in%所需天數的向量,如下所示:

required_vals <- c(2, 4)

fakedat %>%
  group_by(ID) %>%
  filter(all(!is.na(Ab[StudyDay %in% required_vals])))

Output

   ID    StudyDay    Ab
   <chr>    <dbl> <dbl>
 1 A            1    10
 2 A            2    NA
 3 A            3    15
 4 A            4    10
 5 B            1    10
 6 B            2    20
 7 B            3    10
 8 B            4    NA
 9 C            1    10
10 C            2    10
11 C            3    NA
12 C            4    30
13 E            1    10
14 E            2    20
15 E            3    10
16 E            4    30
17 F            1    NA
18 F            2    10
19 F            3    NA
20 F            4    20

base R中,我們可以做

subset(fakedat, ID %in% ID[StudyDay %in% c(2, 4) & !is.na(Ab)])

-輸出

#    ID StudyDay Ab
#1   A        1 10
#2   A        2 NA
#3   A        3 15
#4   A        4 10
#5   B        1 10
#6   B        2 20
#7   B        3 10
#8   B        4 NA
#9   C        1 10
#10  C        2 10
#11  C        3 NA
#12  C        4 30
#17  E        1 10
#18  E        2 20
#19  E        3 10
#20  E        4 30
#21  F        1 NA
#22  F        2 10
#23  F        3 NA
#24  F        4 20

dplyr中的類似選項

library(dplyr)
fakedat %>%
     filter(ID %in% ID[StudyDay %in% c(2, 4) & !is.na(Ab)])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM