![](/img/trans.png)
[英]R: Evaluate function for all pairwise comparison of current observation and previous observations
[英]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.