R: Как я могу применить apply к строкам data.frame и получить $ column_name? - PullRequest
11 голосов
/ 23 марта 2010

Я пытаюсь получить доступ к $ 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 с помощью нотации $: error: «оператор $ недопустим для атомных векторов»

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

Разве это не возможно?

Ответы [ 3 ]

20 голосов
/ 23 марта 2010

Вместо этого вы можете использовать adply из пакета plyr:

library(plyr)
adply(df, 1, function (data.frame_in) print(data.frame_in$a))
10 голосов
/ 23 марта 2010

потому что 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'])}
5 голосов
/ 23 марта 2010

Поскольку apply изменяет тип данных в вашей функции:

> apply(df, 1, class)
[1] "character" "character" "character" "character"

> apply(df, 1, colnames)
NULL

Поскольку имена столбцов отсутствуют, вы не можете ссылаться на значения с помощью оператора $.

Из документации apply:

Если X не является массивом, но имеет атрибут измерения, применяются попытки принудительно привести его к массиву через as.matrix, если он двумерный (например,фреймы данных) или через as.array.

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