簡體   English   中英

過濾列中的值並刪除不符合條件的行

[英]filter on a value in a column and remove rows that dont meet condition

我在 R 中相對較新。 我有這個問題。 我有狗的數據有用部分的數據示例(使用列 age_month 和 rasnaam(品種))

如果它們是小型、中型、大型等,我必須查找所有品種。如果它們是小型品種,則必須刪除 age_month 低於 9 的所有行,如果它們是 age_month 的中型品種行低於 13 必須刪除,(大,age_month < 24)。 我已經嘗試了一些東西,但它不會工作。 我已將所有狗添加到列表中(也使用矢量嘗試過),如下所示:(僅適用於此處的小型犬)

small_dogs <- list("Affenpinscher", "Bichon frisé", "Bolognezer", "Chihuahua, langhaar",
            "Dandie Dinmont Terrier", "Dwergkeeshond", "Japanse Spaniel",
            "Griffon belge", "Griffon bruxellois", "Kleine Keeshond", 
            "Lhasa Apso", "Maltezer", "Mopshond", "Pekingees", "Petit Brabançon",
            "Shih Tzu", "Tibetaanse Spaniel", "Volpino Italiano", "Yorkshire Terrier")

我試過這個:

for (i in 1:nrow(brachquest2)){
     ifelse((brachquest2$rasnaam %in% small_dogs), (brachquest2 <- brachquest2[!(brachquest2$age_month < 9), ]), 
     ifelse((brachquest2$rasnaam %in% medium_dogs)), (brachquest2 <- brachquest2[!(brachquest2$age_month < 13), ]), 
     (brachquest2 <- brachquest2[!(brachquest2$age_month < 24), ]))
            }

但后來我得到一個未使用的 arguments 錯誤。 然后我嘗試使用case_when(),但是我對這個function不熟悉,所以也許我用錯了:

brachquest2 <- case_when(
  brachquest2$rasnaam %in% small_dogs ~ brachquest2[!(brachquest2$age_month < 11), ],
  brachquest2$rasnaam %in% medium_dogs ~ brachquest2[!(brachquest2$age_month < 13), ]
  )

然后我得到一個錯誤:長度必須為 66 或 1,而不是 18。

(行數為66)

我希望我解釋得很好。 有人對我有一些有用的提示嗎? 或者它可能會更簡單,感謝每一個幫助! 提前致謝

下面是對 neilfws 的反應,只有 age_month 和 rasnaam 的 dput。 我不確定這是否是正確的方法

structure(list(age_month = structure(c(50, 52, 52.1, 49.7, 49.7, 
49.6, 49.6, 49.6, 49.5, 50, 48.8, 52.1, 51.9, 48.7, 50, 50.2, 
50.4, 50.5, 49, 49, 49, 49, 49, 48.9, 15, 17.6, 17.6, 17.6, 17.6, 
16.3, 17.6, 17.6, 15, 15.8, 16, 16.2, 17.5, 14.9, 10.4, 10.2, 
10.5, 10.4, 10.3, 10.3, 10.2, 10.3, 10.3, 10.3, 12.8, 12.8, 12.8, 
12.8, 12.8, 10, 10.4, 10.2, 10.3, 10.3, 12.7, 12.7, 13.2, 13.2, 
13.1, 13.1, 12.7, 12.7), units = "days", class = "difftime"), 
    rasnaam = c("American Staffordshire Terrier", "Boxer", "Bull Terrier", 
    "Chihuahua, langhaar", "Chihuahua, langhaar", "Chihuahua, langhaar", 
    "Chihuahua, langhaar", "Chihuahua, langhaar", "Chihuahua, langhaar", 
    "Chihuahua, langhaar", "Franse Bulldog", "Franse Bulldog", 
    "Labrador Retriever", "Shih Tzu", "American Staffordshire Terrier", 
    "American Staffordshire Terrier", "American Staffordshire Terrier", 
    "American Staffordshire Terrier", "American Staffordshire Terrier", 
    "American Staffordshire Terrier", "American Staffordshire Terrier", 
    "American Staffordshire Terrier", "American Staffordshire Terrier", 
    "American Staffordshire Terrier", "American Staffordshire Terrier", 
    "Boxer", "Boxer", "Boxer", "Boxer", "Boxer", "Bull Terrier", 
    "Bull Terrier", "Chihuahua, langhaar", "Chihuahua, langhaar", 
    "Chihuahua, langhaar", "Chihuahua, langhaar", "Chihuahua, langhaar", 
    "Franse Bulldog", "Franse Bulldog", "Franse Bulldog", "Franse Bulldog", 
    "Franse Bulldog", "Labrador Retriever", "Labrador Retriever", 
    "Labrador Retriever", "Labrador Retriever", "Labrador Retriever", 
    "Labrador Retriever", "Labrador Retriever", "Labrador Retriever", 
    "Labrador Retriever", "Labrador Retriever", "Labrador Retriever", 
    "Shih Tzu", "Shih Tzu", "Shih Tzu", "Shih Tzu", "Shih Tzu", 
    "American Staffordshire Terrier", "Boxer", "Franse Bulldog", 
    "Franse Bulldog", "Shih Tzu", "Shih Tzu", "American Staffordshire Terrier", 
    "Boxer")), row.names = c(NA, -66L), class = "data.frame")

如果您想堅持使用case_when ,這是實現您正在尋找的一種方法:

library(dplyr)

brachquest2 %>%
  mutate(
    # Create a temp var, removal_status, to label what rows should be kept or removed
    removal_status = case_when(
      (rasnaam %in% small_dogs) & age_month < 9 ~ "Remove",
      (rasnaam %in% medium_dogs) & age_month < 13 ~ "Remove",
      (rasnaam %in% large_dogs) & age_month < 24 ~ "Remove",
      TRUE ~ "Keep"
    )) %>% 
  # Keep only what's labelled "Keep"
  filter(removal_status == "Keep") %>% 
  # Remove temp var
  select(-removal_status)

使用您提供的small_dogs列表並創建我自己的medium_dogs列表,其中只有一個值,boxer,我得到以下結果(刪除了 13 歲以下的 2 個拳擊手):

#   age_month                        rasnaam
# 1  50.0 days American Staffordshire Terrier
# 2  52.0 days                          Boxer
# 3  52.1 days                   Bull Terrier
# 4  49.7 days            Chihuahua, langhaar
# 5  49.7 days            Chihuahua, langhaar
# 6  49.6 days            Chihuahua, langhaar
# 7  49.6 days            Chihuahua, langhaar
# 8  49.6 days            Chihuahua, langhaar
# 9  49.5 days            Chihuahua, langhaar
# 10 50.0 days            Chihuahua, langhaar
# 11 48.8 days                 Franse Bulldog
# 12 52.1 days                 Franse Bulldog
# 13 51.9 days             Labrador Retriever
# 14 48.7 days                       Shih Tzu
# 15 50.0 days American Staffordshire Terrier
# 16 50.2 days American Staffordshire Terrier
# 17 50.4 days American Staffordshire Terrier
# 18 50.5 days American Staffordshire Terrier
# 19 49.0 days American Staffordshire Terrier
# 20 49.0 days American Staffordshire Terrier
# 21 49.0 days American Staffordshire Terrier
# 22 49.0 days American Staffordshire Terrier
# 23 49.0 days American Staffordshire Terrier
# 24 48.9 days American Staffordshire Terrier
# 25 15.0 days American Staffordshire Terrier
# 26 17.6 days                          Boxer
# 27 17.6 days                          Boxer
# 28 17.6 days                          Boxer
# 29 17.6 days                          Boxer
# 30 16.3 days                          Boxer
# 31 17.6 days                   Bull Terrier
# 32 17.6 days                   Bull Terrier
# 33 15.0 days            Chihuahua, langhaar
# 34 15.8 days            Chihuahua, langhaar
# 35 16.0 days            Chihuahua, langhaar
# 36 16.2 days            Chihuahua, langhaar
# 37 17.5 days            Chihuahua, langhaar
# 38 14.9 days                 Franse Bulldog
# 39 10.4 days                 Franse Bulldog
# 40 10.2 days                 Franse Bulldog
# 41 10.5 days                 Franse Bulldog
# 42 10.4 days                 Franse Bulldog
# 43 10.3 days             Labrador Retriever
# 44 10.3 days             Labrador Retriever
# 45 10.2 days             Labrador Retriever
# 46 10.3 days             Labrador Retriever
# 47 10.3 days             Labrador Retriever
# 48 10.3 days             Labrador Retriever
# 49 12.8 days             Labrador Retriever
# 50 12.8 days             Labrador Retriever
# 51 12.8 days             Labrador Retriever
# 52 12.8 days             Labrador Retriever
# 53 12.8 days             Labrador Retriever
# 54 10.0 days                       Shih Tzu
# 55 10.4 days                       Shih Tzu
# 56 10.2 days                       Shih Tzu
# 57 10.3 days                       Shih Tzu
# 58 10.3 days                       Shih Tzu
# 59 12.7 days American Staffordshire Terrier
# 60 13.2 days                 Franse Bulldog
# 61 13.2 days                 Franse Bulldog
# 62 13.1 days                       Shih Tzu
# 63 13.1 days                       Shih Tzu
# 64 12.7 days American Staffordshire Terrier

根據需要調整列表和 age_month 條件。

暫無
暫無

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

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