11

我正在尝试使用以下示例访问 $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

这不可能吗?

4

3 回答 3

20

您可以使用adplyplyr 包代替:

library(plyr)
adply(df, 1, function (data.frame_in) print(data.frame_in$a))
于 2010-03-23T03:10:40.227 回答
11

因为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'])}
于 2010-03-23T02:35:25.960 回答
5

因为apply更改了函数中的数据类型:

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

> apply(df, 1, colnames)
NULL

由于没有列名,因此您无法使用$运算符引用这些值。

apply文档中:

如果 X 不是数组但具有维度属性,则 apply 尝试通过 as.matrix 如果它是二维(例如,数据帧)或通过 as.array 将其强制转换为数组。

于 2010-03-23T02:34:34.590 回答