2016-06-08 60 views
0

我有一個名爲data1數據集由寫在列超過214個國家和地區。我想刪除所有不屬於非洲國家的行。使用一個循環從一個大的數據集刪除多行和grepl

我知道,我可以將下面的代碼刪除特定行:

data1clean <- data1[!grepl("Albania",data1$Country.Name),] 
data2clean <- data1clean[!grepl("Andorra",data1$Country.Name),] 
data3clean <- data2clean[!grepl("France",data1$Country.Name),] 
... 

事實是,我不想寫這個命令的100倍以上。我在想一個循環可能是,但我的工作不:

x <- data1clean 
i <- Country.Names$data1 
if(i=c("Albania","Andorra","France"){ 
    print(x <- data1[!grepl(i,data1$Country.Name),]) 
} 
+2

研究'幫助( 「[」)'多少有效地做到這一點。 「'$'不允許計算索引」 – Roland

回答

3

也許最好的方法是建立非洲國家的列表,並使用%in%

# vector of african countries 
africanCountries <- c("Algeria", "Angola", ..., "Zambia", "Zimbabwe") 

# subset using %in% 
myData <- data1[data1$country %in% africanCountries, ] 

如果你擔心約上/下情況下,你可以使用touppertolower功能得到向量同意。

+0

你完美的回答我的問題。不過,我仍然懷疑我的問題是否可以使用循環來回答。 –

+1

這是可能的,但效率低下。在最佳情況下,您可以循環播放非洲國家的媒介並收集要保留的行,或者通過非非洲國家的媒介運行,並收集要放下的行。然後,在循環之後,保持/放下這些行。 – lmo

2

我們可以data.table

library(data.table) 
africanCountries <- c("Algeria", "Angola", ..., "Zambia", "Zimbabwe") 
dt1 <- setDT(data1, key = "country")[(africanCountries)]