Ответ 1
Позвольте обернуть несколько комментариев в объяснение.
- использование
apply
преобразует adata.frame
вmatrix
. Эта означает, что будет использоваться наименее ограничивающий класс. В мере ограничительным в этом случае является символ. - Вы отправляете аргумент
1
вapply
MARGIN
. Это относится по ряду и делает вас еще хуже, поскольку вы действительно смешиваете классы теперь вместе. В этом случае вы используетеapply
для матриц и data.frames на вектор. Это не подходящий инструмент для работы. - В этом случае я бы использовал
lapply
илиsapply
, так как rmk указывает на захват классов единственный столбец t2, как показано ниже:
код:
df <- data.frame(v=1:10, t=1:10)
df <- transform(df, t2 = as.POSIXlt(t, origin = "2013-08-13"))
sapply(df[, "t2"], class)
lapply(df[, "t2"], class)
## [[1]]
## [1] "POSIXct" "POSIXt"
##
## [[2]]
## [1] "POSIXct" "POSIXt"
##
## [[3]]
## [1] "POSIXct" "POSIXt"
##
## .
## .
## .
##
## [[9]]
## [1] "POSIXct" "POSIXt"
##
## [[10]]
## [1] "POSIXct" "POSIXt"
В общем случае вы выбираете семейство apply
, которое соответствует заданию. Часто я лично использую цикл lapply
или for
для работы с определенными столбцами или подмножества столбцов, которые я хочу использовать для индексирования ([, ]
), а затем перейдите к apply
. Ответ на эту проблему действительно сводится к определению того, что вы хотите выполнить, спрашивая apply
наиболее подходящий инструмент и продолжайте оттуда.
Могу ли я предложить этот пост в блоге в качестве отличного учебника о том, что делает в своем классе apply
множество функций.