1

可能重复:
在 R 中,访问列表元素的 [] 和 [[]] 符号有什么区别?

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

据我所知, [1,] 将获取 a 的第一行matrix, [,1] 将获取第一列。[[1]] 将获取 a 的第一个元素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] 在 中使用vector,但为什么它们都在数据框中可用?

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

4

1 回答 1

4

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

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

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

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

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

> `[.data.frame`

> `[[.data.frame`

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

于 2012-06-04T11:01:14.443 回答