Р:Как я могу использовать apply к строкам data.frame и получить $column_name?
Вопрос
Я пытаюсь получить доступ к $a, используя следующий пример:
df<-data.frame(a=c("x","x","y","y"),b=c(1,2,3,4))
> df
a b
1 x 1
2 x 2
3 y 3
4 y 4
test_fun <- function (data.frame_in) {
print (data.frame_in[1])
}
Теперь я могу получить доступ к $a, если использую индекс для первого столбца:
применить (df, 1, test_fun)
a
"x"
a
"x"
a
"y"
a
"y"
[1] "x" "x" "y" "y"
Но я не могу получить доступ к столбцу $a с обозначением $:ошибка:«Оператор $ недействителен для атомарных векторов»
test_fun_2 <- function (data.frame_in) {
print (data.frame_in$a)
}
>apply(df, 1, test_fun_2)
Error in data.frame_in$a : $ operator is invalid for atomic vectors
Разве это невозможно?
Решение
Вы могли бы использовать adply
вместо этого из пакета plyr:
library(plyr)
adply(df, 1, function (data.frame_in) print(data.frame_in$a))
Другие советы
потому что data.frame.in
не является data.frame:
apply(df, 1, function(v){print(class(v))})
но вы можете получить доступ к именованным элементам с помощью:
test_fun_2 <- function (data.frame_in) {
+ print (data.frame_in['a'])}
Потому что apply
меняет тип данных в вашей функции:
> apply(df, 1, class)
[1] "character" "character" "character" "character"
> apply(df, 1, colnames)
NULL
Поскольку имена столбцов отсутствуют, вы не можете ссылаться на значения с помощью $
оператор.
Из apply
документация:
Если X не является массивом, но имеет dimension, применить попытки к привести его к массиву через as.matrix, если он двумерный (например, данные frames) или через as.array.