2011-10-12 75 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