簡體   English   中英

如何刪除R中當年沒有觀察到的所有觀察結果?

[英]How to remove all observations for which there is no observation in the current year in R?

     num Name  year   X         Y 
1      1   A   2015    68      80%
2      1   A   2016    69      85%
3      1   A   2017    70      95%
4      1   A   2018    71      85%
5      1   A   2019    72      90%
6      2   B   2018    20      80%
7      2   B   2019    23      75%
8      2   C   2014     3      55%
9      4   D   2012     4      75%
10     4   D   2013     5      100%

假設我有上述數據。 我想刪除最近一年沒有任何觀察的觀察。 所以,在上面,我們將留下 A & B,但 C & D 將被刪除。 最近的賽季總是在數據中,可以用 max() 函數引用(即,我們不需要硬編碼為 2019 並每年更新)。

計划是創建一個多面環繞折線圖,其中百分比在 y 軸上,年份在 x 軸上。 方面將在名稱上,因此每個人都有自己的折線圖,其中包含按年份的百分比。 我們不在乎離開的人,所以這就是我們刪除記錄的原因。 但是,它們有可能會回來,所以我不想將它們從基礎數據中刪除。

一種dplyr選項可能是:

df %>%
 group_by(Name) %>%
 filter(any(year %in% max(df$year)))

    num Name   year     X Y    
  <int> <chr> <int> <int> <chr>
1     1 A      2015    68 80%  
2     1 A      2016    69 85%  
3     1 A      2017    70 95%  
4     1 A      2018    71 85%  
5     1 A      2019    72 90%  
6     2 B      2018    20 80%  
7     2 B      2019    23 75%  

W 也可以使用來自base R subset ,方法是將 'Name' 子集,其中 'year' 是max ,獲取unique元素並創建一個帶有%in%的邏輯向量來對行進行子集

subset(df1, Name %in% unique(Name[year == max(year)]))
# num Name year  X   Y
#1   1    A 2015 68 80%
#2   1    A 2016 69 85%
#3   1    A 2017 70 95%
#4   1    A 2018 71 85%
#5   1    A 2019 72 90%
#6   2    B 2018 20 80%
#7   2    B 2019 23 75%

沒有使用包


dplyr類似的語法

library(dplyr)
df1 %>% 
     filter(Name %in% unique(Name[year == max(year)]))

數據

df1 <- structure(list(num = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 4L, 4L
), Name = c("A", "A", "A", "A", "A", "B", "B", "C", "D", "D"), 
    year = c(2015L, 2016L, 2017L, 2018L, 2019L, 2018L, 2019L, 
    2014L, 2012L, 2013L), X = c(68L, 69L, 70L, 71L, 72L, 20L, 
    23L, 3L, 4L, 5L), Y = c("80%", "85%", "95%", "85%", "90%", 
    "80%", "75%", "55%", "75%", "100%")), class = "data.frame", 
    row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))

使用末尾注釋中顯示的數據框DF ,我們使用semi_join將其縮減為所需的名稱,將 Y 轉換為數字並繪制它。 DF未修改。

semi_join行的可能替代方案是

filter(ave(year == max(year), Name, FUN = any)) %>%

代碼是——

library(dplyr)
library(ggplot2)

DF %>%
  semi_join(filter(., year == max(year)), by = "Name") %>%
  mutate(Y = as.numeric(sub("%", "", Y))) %>% 
  ggplot(aes(year, Y)) + geom_line() + facet_wrap(~Name)

截屏

筆記

可重現形式的輸入:

Lines <- "     num Name  year   X         Y
1      1   A   2015    68      80%
2      1   A   2016    69      85%
3      1   A   2017    70      95%
4      1   A   2018    71      85%
5      1   A   2019    72      90%
6      2   B   2018    20      80%
7      2   B   2019    23      75%
8      2   C   2014     3      55%
9      4   D   2012     4      75%
10     4   D   2013     5      100%"
DF <- read.table(text = Lines)

暫無
暫無

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

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