對于一個小型研究專案,我必須使用包含多個國家和多年的基尼系數的大型面板資料集。然而,資料并不總是每年收集一次,而且經常發生在一個國家只有幾個資料點可用的情況。
我的目標是只選擇那些連續兩年或兩年以上可用的國家。
例如:A:2008 10 2012 10.7 2015 12
應該從資料集中洗掉,但是,我想保留以下物體:
B: 2001 5 2002 5.6 2003 7 2009 8.6
我嘗試了以下代碼:
df_new <- ddply(df, "country", function(x) {
cons_idx <- which(diff(x$year) == 1)
cons_idx <- sort(unique(c(cons_idx, cons_idx 1)))
x[cons_idx, ]
})
基于 stakoverflow 1 上發布的類似問題
雖然這段代碼確實丟棄了 A(正確地)它也丟棄了 B 中的 2009。因此,它回傳:B: 2001 5 2002 5.6 2003 7
然而,我確實希望包括2009年,它只是應該丟棄沒有任何連續兩年的物體。
我的直覺是我必須使用某種 if-else 陳述句,但我真的被卡住了。任何幫助將不勝感激!
uj5u.com熱心網友回復:
這是一個tidyverse方法。對于每個國家/地區,檢查是否存在任何 1 年差異。如果此評估為真,這將保留該國家/地區的所有資料。
df <- data.frame(
country = c("A", "A", "A", "B", "B", "B", "B"),
year = c(2008, 2012, 2015, 2001, 2002, 2003, 2009),
value = c(10, 10.7, 12, 5, 5.6, 7, 8.6)
)
library(tidyverse)
df %>%
group_by(country) %>%
filter(any(diff(year) == 1))
輸出
country year value
<chr> <dbl> <dbl>
1 B 2001 5
2 B 2002 5.6
3 B 2003 7
4 B 2009 8.6
uj5u.com熱心網友回復:
使用ave按國家和測驗,你可以組一年,如果any一年diff樣品都等于==到1。由于ave 不幸地將結果強制轉換為數字,我們堅持as.logical將括號內的資料框子集化。
df[with(df, as.logical(ave(year, country, FUN=\(x) any(c(0, diff(x)) == 1)))), ]
# country year value
# 4 B 2001 5.0
# 5 B 2002 5.6
# 6 B 2003 7.0
# 7 B 2009 8.6
資料:
df <- structure(list(country = c("A", "A", "A", "B", "B", "B", "B"),
year = c(2008, 2012, 2015, 2001, 2002, 2003, 2009), value = c(10,
10.7, 12, 5, 5.6, 7, 8.6)), class = "data.frame", row.names = c(NA,
-7L))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/393455.html
下一篇:在QA序列中找到最后注視的人
