2015-11-02 44 views
0

我想創建我的數據框的兩個子集稱爲「數據」。原始數據框包含三個小組/小組:阿富汗,巴西和德國,參加者爲1999 - 2001年三年。基於列條目的數據框中的完整面板的子集

子集ONE應該只包含1999年人口> 500,000的國家。這意味着不僅1999年人口爲< = 500,000的特定行被刪除,而且還包含整個面板/組/國家/地區。

子集TWO應只包含三年內人口平均值> 500,000的面板/組/國家。我認爲這意味着人們首先會創建一個「data $ meanpop」的新變量,然後創建子集。

我曾嘗試過使用子集和dplyr軟件包/函數,但我無法讓它工作。

小例子:

a <- c(rep("Afghanistan",3), 
    rep("Brazil",3), 
    rep("Germany",3)) 
b <- c(1999:2001,1999:2001,1999:2001) 
c <- c(520000,510000,530000,20,0,5,NA,7000,1800000) 
data <- as.data.frame(cbind(a,b,c)) 
colnames(data) <- c("country","year","population") 

data 
country year population 
1 Afghanistan 1999  520000 
2 Afghanistan 2000  510000 
3 Afghanistan 2001  530000 
4  Brazil 1999   20 
5  Brazil 2000   0 
6  Brazil 2001   5 
7  Germany 1999  <NA> 
8  Germany 2000  7000 
9  Germany 2001 1800000 

結果子集應該是這樣的:

1 Afghanistan 1999  520000 
2 Afghanistan 2000  510000 
3 Afghanistan 2001  530000 

結果子集兩者應該是這樣的(我沒有在這裏創建一個數據$平均列):

country year population meanpop 
1 Afghanistan 1999  520000 520000.00 
2 Afghanistan 2000  510000 520000.00 
3 Afghanistan 2001  530000 520000.00 
7  Germany 1999  <NA> 903500.00 
8  Germany 2000  7000 903500.00 
9  Germany 2001 1800000 903500.00 

回答

0

我會爲那些遇到類似問題的人回答我的問題。

子集的一個:

newdata <- data[ which(data$year==1999 & data$population>500000),] 
keep <- newdata$country 
data[data$country==keep,] 

爲您提供:

# country year population 
# 1 Afghanistan 1999  520000 
# 2 Afghanistan 2000  510000 
# 3 Afghanistan 2001  530000 

子集二:

a <- by(data$population,data$country,mean,na.rm=T) 
a 
a > 500000 #to check countries by 'eye' 

means <- as.data.frame(a[data$country]) 
colnames(means) <- "popmean" 
means <- round(means,2) 
data2 <- cbind(data,means) #now we have a new variable with the panel means 
newdata2 <- data2[ which(data2$popmean>500000),] 

爲您提供:

#    country year population popmean 
# 1 Afghanistan 1999  520000 520000 
# 2 Afghanistan 2000  510000 520000 
# 3 Afghanistan 2001  530000 520000 
# 7  Germany 1999   NA 903500 
# 8  Germany 2000  7000 903500 
# 9  Germany 2001 1800000 903500 

如果有人知道一個更簡單的方法來解決這個問題,我會很感激你的評論,這樣我就可以提高自己的編程技能。