2011-10-12 73 views
4

是否有一個內置的便利功能,可以返回data.frame,矩陣或向量中元素的數量? length(matrix)length(vector)工作,但length(data.frame)返回列數。 prod(dim(vector))總是返回1,但對矩陣/數據幀運行正常。我正在尋找一種適用於所有三種功能的單一功能。Data.frame中的#元素,矩陣,矢量的便利功能?

回答

6

我不認爲一個已經存在,所以只寫你自己的。您應該只需要2例,1)名單,2)數組:

elements <- function(x) { 
    if(is.list(x)) { 
    do.call(sum,lapply(x, elements)) 
    } else { 
    length(x) 
    } 
} 
d <- data.frame(1:10, letters[1:10]) 
m <- as.matrix(d) 
v <- d[,1] 
l <- c(d, list(1:5)) 
L <- list(l, list(1:10)) 
elements(d) # data.frame 
# [1] 20 
elements(m) # matrix 
# [1] 20 
elements(v) # vector 
# [1] 10 
elements(l) # list 
# [1] 25 
elements(L) # list of lists 
# [1] 35 
+1

我不會認爲你需要測試數組的情況下,'length'應該爲矩陣和數組返回正確的值 –

+0

@DWin:非常真實,謝謝你的指針 –

5

length(unlist(whatever))怎麼樣? (注意:我只想回復說沒有這樣的功能,但突然間我記得我剛剛在30分鐘前使用了unlist,並且它可以用於獲得簡單的解決方案!真是巧合......)

+0

的作品太好了! – SFun28

+3

'無論(無論)'如果'無論'大,可能會很費時。 –

+0

@Joshua,nope,我對它進行了測試,即使對於2 * 10^7記錄(我不能在內存中放置更多),我也能立即做出反應。我認爲我們有時會優化太多 - 太多併發症沒有任何好處:-) – TMS

1

我個人的 '便利功能' 這個是:

Rgames: lssize 
function(items){ 
sizes<-sapply(sapply(sapply(sapply(items,get,simplify=F),unlist,simplify=F),as.vector,simplify=F),length) 
return(sizes) 
    } 

它適用於每一個 'typeof運算' 可變我能想到的的。 FWIW,這是我的工具包的一部分,其中包括有用的「在我的工作區發現只有一種類型的變量」:

Rgames: lstype 
function(type='closure'){ 
    inlist<-ls(.GlobalEnv) 
    if (type=='function') type <-'closure' 
    typelist<-sapply(sapply(inlist,get),typeof) 
    return(names(typelist[typelist==type])) 

}

+0

Carl - 非常感謝!我認爲這會遭受同樣的unlist性能問題約書亞提到了嗎?是你公開的工具包嗎? – SFun28

+0

SFun:我不認爲我已經把我所有的「玩具」都放在任何地方,但是我當然不會保留任何版權或其他東西,請瀏覽http:// witthoft .com/rtools.html幾天後,看看我是否記得爲「mytoys」添加鏈接,如果我沒有,給我發一封電子郵件來提醒我,至於未列出的表演時間 - 我還沒有嘗試過它在任何gigundo名單上,所以我不知道。 –

+0

真棒!期待t檢查出來。 – SFun28