Удобная функция для # элементов в data.frame, matrix, vector? - PullRequest
4 голосов
/ 12 октября 2011

Есть ли встроенная вспомогательная функция, которая возвращает количество элементов в data.frame, матрице или векторе? length( matrix ) и length( vector ) работают, но length( data.frame ) возвращает количество столбцов. prod( dim( vector ) ) всегда возвращает 1, но отлично работает с matrix / data.frame. Я ищу одну функцию, которая работает для всех трех.

Ответы [ 3 ]

6 голосов
/ 12 октября 2011

Я не думаю, что он уже существует, поэтому просто напишите свой. Вам нужно только 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
5 голосов
/ 12 октября 2011

Как насчет length(unlist(whatever))?

(Примечание: я просто хотел ответить, что такой функции нет, но внезапно вспомнил, что 30 минут назад я использовал unlist и что ее можно использовать для упрощениярешение! Какое совпадение ...)

1 голос
/ 12 октября 2011

Моя личная «удобная функция» для этого:

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]))

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...