对于R中的数据帧,[1],[1,],[,1],[[1]]之间的区别是什么?

时间:2012-06-04 01:51:37

标签: r statistics sas

  

可能重复:
  In R, what is the difference between the [] and [[]] notations for accessing the elements of a list?

我对数据帧类型的[1],[1,],[,1],[[1]]的区别感到困惑。

据我所知,[1,]将获取matrix的第一行,[,1]将获取第一列。 [[1]]将获取list的第一个元素。

但我检查了data.frame的文件,其中说的是

  

数据框是具有相同行数的变量列表   唯一的行名称

然后我输入了一些代码来测试用法。

>L3 <- LETTERS[1:3]
>(d <- data.frame(cbind(x=1, y=1:10), fac=sample(L3, 10, replace=TRUE)))
  x  y fac
1  1  1   C
2  1  2   B
3  1  3   C
4  1  4   C
5  1  5   A
6  1  6   B
7  1  7   C
8  1  8   A
9  1  9   A
10 1 10   A
> d[1]
   x
1  1
2  1
3  1
4  1
5  1
6  1
7  1
8  1
9  1
10 1
>d[1,]
  x y fac
1 1 1   C
>d[,1]
 [1] 1 1 1 1 1 1 1 1 1 1
>d[[1]]
 [1] 1 1 1 1 1 1 1 1 1 1

令我困惑的是:[1,]和[,1]仅用于matrix。 [[1]]仅用于list,[1]}中使用[1],但为什么所有数据都可用于数据框?

有人可以解释这些用法的区别吗?

1 个答案:

答案 0 :(得分:4)

在R中,运算符不用于的一种数据类型。对于您喜欢的任何数据类型,操作符都可以重载(例如S3 / S4类)。

事实上,data.frames就属于这种情况。

  • 由于data.frames是列表,[i][[i]](以及$)会显示类似列表的行为。

  • 行,列表索引对表有直观的意义,而data.frames看起来像表。可能这就是为什么定义data.frame [i,j]的方法的原因。

您甚至可以查看定义,它们在S3系统中编码(所以methodname.class):

> `[.data.frame`

> `[[.data.frame`

(反引号引用函数名称,否则R将尝试使用运算符并最终出现语法错误)