2011-11-28 37 views
2

我想通過一個字符串名稱來處理數據框的行,並且該表將按順序構建。我想做類似檢查數據框中是否存在行名稱?

> mytab <- data.frame(city=c("tokyo","delhi","lima"),price=c(9,8,7),row.names=1) 
> mytab 
     price 
tokyo  9 
delhi  8 
lima  7 
> # I can add a new row 
> mytab["london",] = 8.5 

我現在需要檢查行名是否已經存在。

> mytab["ny",] 
[1] NA 

還有什麼更好的,我可以比

> if (is.na(mytab["ny",])) { mytab["ny",]=9;}

做其他因爲NA否則可能會出現呢?

回答

3

像這樣的事情

if (!('ny' %in% row.names(mytab))) {mytab['ny',]=9} 

可能做的伎倆。

+0

應該這樣做,但它看起來這將有'O(n)的'時間複雜度由於線性搜索,也可以是'O(n)的'由於形成'row.names(mytab)'而導致的空間複雜性。這是真的?無論如何,行名搜索總是線性搜索? – highBandWidth

+0

@highBandWidth - sungam有一個相當快的答案,但每個查找的確是O(n)。你的評論讓我想知道:你是否想測試很多的rownames,如果是這樣,你可以一次完成嗎? – Tommy

1

有很多方法可以做到這一點。一個最簡單的就是用這樣的任何()函數:

# Returns true if any of the row names is 'lima', false otherwise. 
any(row.names(mytab) == 'lima') 

因爲這會返回一個布爾值,你可以從分支條件語句就請你。

+0

謝謝!我想你的意思是任何(row.names(mytab)=='利馬')'而不是。我猜它和@ sungam的方法是一樣的。你知道常規的行名查詢是否比線性搜索更好? – highBandWidth

+1

應該是'any(row.names(mytab)=='lima')'? – djq

2

如果您想要一次查看多個城市,請稍微改變一下。這可能有助於加快速度吧......

mytab <- data.frame(city=c("tokyo","delhi","lima"),price=c(9,8,7),row.names=1) 

# Check several cities in one go: 
newcities <- c('foo', 'delhi', 'bar') 

# Returns the missing cities: 
setdiff(newcities, row.names(mytab)) 
#[1] "foo" "bar" 

# Returns the existing cities: 
intersect(newcities, row.names(mytab)) 
#[1] "delhi" 
+0

+ for setdiff() –