簡體   English   中英

R:如何根據給定列的值刪除數據框的行

[英]R: How to delete rows of a data frame based on the values of a given column

我有100個模擬數據集,例如下面顯示一個數據集

pid time status
1    2     1
1    6     0
1    4     1
2    3     0
2    1     1
2    7     1
3    8     1
3    11    1
3    2     0

pid表示患者編號。 這表明每個患者在“時間和狀態”列上都有三個記錄。 我想編寫R代碼以刪除狀態為0的任何行(如果該行不是給定患者的第一次觀察的記錄),並保留狀態為0的行(如果它表示第一次觀察),而其余狀態為1的行將在此之后該患者的0被刪除。 輸出應該看起來像

pid time status
1    2     1
1    4     1
2    3     0
3    8     1
3    11    1

由於有100個模擬數據集,因此對於所有數據,狀態欄中0和1的位置都不相同。 有人可以提供能夠執行此任務的R代碼嗎? 先感謝您。

dplyr軟件包可以提供幫助。 我在您的數據示例中添加了一條記錄,以為pid包含多個0值。

按pid分組,並使用函數first您可以保留status的第一個值。 由於該組,因此將為每個pid保留所有記錄。 然后,如果第一條記錄為0且row_number()= 1,以防萬一有更多的記錄為0(請參見pid 4),或者如果第一條記錄的狀態為1,並保留所有狀態為1的記錄,則僅進行過濾。

df %>% 
  group_by(pid) %>% 
  filter((first(status) == 0 & row_number() == 1) | (first(status) == 1 & status == 1))

# A tibble: 6 x 3
# Groups:   pid [4]
    pid  time status
  <int> <int>  <int>
1     1     2      1
2     1     4      1
3     2     3      0
4     3     8      1
5     3    11      1
6     4     3      0

數據:

df <-
  structure(
    list(
      pid = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L),
      time = c(2L, 6L, 4L, 3L, 1L, 7L, 8L, 11L, 2L, 3L, 6L, 8L),
      status = c(1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L)
    ),
    .Names = c("pid", "time", "status"),
    class = "data.frame",
    row.names = c(NA,-12L)
  )

這個問題在https://stackoverflow.com上更合適。

這是使用tapply()的嘗試tapply()有點冗長):

dat <- structure(list(pid = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L),
                      time = c(2L, 6L, 4L, 3L, 1L, 7L, 8L, 11L, 2L),
                      status = c(1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 0L)),
                 .Names = c("pid", "time", "status"), class = "data.frame",
                 row.names = c(NA, -9L))
ind <- unlist(tapply(dat$status, dat$pid, function(x) {
    # browser()
    y <- (rep(FALSE, length(x)))
    if (x[1] == 1) {
        y[x != 0] <- TRUE
    } else {
        y[1] <- TRUE
    }
    y
}))
dat[ind, ]
#>   pid time status
#> 1   1    2      1
#> 3   1    4      1
#> 4   2    3      0
#> 7   3    8      1
#> 8   3   11      1

indTRUEFALSE的向量,它們將指示是否應根據您的規則保留一行dat

我使用tapply(X, INDEX, FUN) 函數應用於向量的子集(此處X = dat$status ),該子集由分組因子定義(此處INDEX = dat$pid )。 在這里,我使用了一個匿名函數(即FUN = function(x){} )對X每個子集進行操作。 特別是,我首先將y定義為FALSE的向量,稍后再返回。 如果子組的第一個狀態為1,則將所有非零元素(即y[x != 0] )轉換為TRUE 否則,我僅將第一個元素(即y[1] )轉換為TRUE

您可以取消注釋browser()語句,並在控制台上輸入n (表示下一個)或xy (以查看其含義)來查看函數的作用。

暫無
暫無

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

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