2010-03-23 9 views
10

estoy tratando de acceder a un $ utilizando el siguiente ejemplo:

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

ahora puedo acceder $ a si uso un índice para la primera columna:

apply(df, 1, test_fun)

a 
"x" 
    a 
"x" 
    a 
"y" 
    a 
"y" 
[1] "x" "x" "y" "y" 

Pero no puede acceder a la columna $ $ a con la notación: error: "$ operador no es válida para los vectores atómicas"

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 

¿No es esto posible?

Respuesta

19

Usted podría use adply del paquete plyr en su lugar:

library(plyr) 
adply(df, 1, function (data.frame_in) print(data.frame_in$a)) 
+1

Hermoso. Pasé bastante tiempo buscando preguntas sobre "cómo utilizo apply on dataframe" con soluciones que al final solo podían resolver el problema específico en cuestión. ¡Este no solo responde todas las preguntas que vi, sino que también resuelve las mías! –

5

Debido apply cambia el tipo de datos en su función:

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

> apply(df, 1, colnames) 
NULL 

Dado que no existen nombres de columna, no se puede hacer referencia a los valores con el operador $.

Desde el apply documentación:

If X is not an array but has a dimension attribute, apply attempts to coerce it to an array via as.matrix if it is two-dimensional (e.g., data frames) or via as.array.

+6

¿Ninguna sugerencia sobre cómo mitigar este problema? – Richard

+1

bienvenido a R ... – Gus

9

porque data.frame.in no es un hoja.de.datos:

apply(df, 1, function(v){print(class(v))}) 

pero se puede acceder a los elementos nombrados con:

test_fun_2 <- function (data.frame_in) { 
+  print (data.frame_in['a'])} 
+0

Hermosa solución, gracias! – Richard

Cuestiones relacionadas