R: как подмножить data.frame в списке и вернуть data.frame?

При подмножении data.frame внутри списка я получаю векторы вместо data.frames (см. пример ниже). Как этого избежать и получить data.frames?

l <- list(data.frame(a=c(1,2,3)), data.frame(b=c(4,5,6,5)), data.frame(c=c(3,4,5,6)))
names(l) <- c("A", "B", "C")
l
lapply(l, function(x) x[2:nrow(x), ])

выход

> l <- list(data.frame(a=c(1,2,3)), data.frame(b=c(4,5,6,5)), data.frame(c=c(3,4,5,6)))
> names(l) <- c("A", "B", "C")
> l
$A
  a
1 1
2 2
3 3

$B
  b
1 4
2 5
3 6
4 5

$C
  c
1 3
2 4
3 5
4 6

> lapply(l, function(x) x[2:nrow(x), ])
$A
[1] 2 3

$B
[1] 5 6 5

$C
[1] 4 5 6

person jrara    schedule 04.08.2011    source источник
comment
lapply возвращает список, а не вектор, как вы утверждаете.   -  person Dirk Eddelbuettel    schedule 04.08.2011
comment
Да, я это знаю, я имею в виду векторы внутри списка.   -  person jrara    schedule 04.08.2011
comment
@Dirk: Технически список является вектором! ;-)   -  person Tommy    schedule 04.08.2011
comment
@Tommy: Это правда в R? Я думал, что список - это фундаментальный тип данных, такой же, как вектор....   -  person Ari B. Friedman    schedule 04.08.2011
comment
is.vector(list()) # TRUE ...но обычно мы имеем в виду атомарный вектор, когда говорим вектор. is.atomic(list()) # FALSE   -  person Tommy    schedule 05.08.2011


Ответы (1)


Вам нужен аргумент ,drop=FALSE

> res <- lapply(l, function(x) x[2:nrow(x),, drop=FALSE])
> sapply(res,class)
           A            B            C 
"data.frame" "data.frame" "data.frame" 
> res
$A
  a
2 2
3 3

$B
  b
2 5
3 6
4 5

$C
  c
2 4
3 5
4 6
person Ari B. Friedman    schedule 04.08.2011
comment
Да ничего общего с lapply. - person hadley; 05.08.2011