18

我在哪里可以找到有关通过以下方式调用 data.frame 中的列之间的差异的信息:

df <- data.frame(x=1:20,y=letters[1:20],z=20:1)

df$x
df["x"]

它们都返回“相同”的结果,但不一定采用相同的格式。我注意到的另一件事是 df$x 返回一个列表。而 df["x"] 返回一个 data.frame。

编辑:但是,知道在哪种情况下使用哪个已成为一项挑战。这里是否有最佳实践,或者它真的归结为知道命令或功能需要什么?到目前为止,如果我的功能一开始不起作用(反复试验),我就一直在循环使用它们。

4

7 回答 7

16

另一个区别是您的示例数据框df$w返回NULLdf['w']/或df[['w']]给出错误。

于 2010-07-30T12:54:52.003 回答
14

如果我没记错的话,df$x是一样的df[['x']][[用于选择任何单个元素,而[返回所选元素的列表。另请参阅语言参考。我通常看到 [[ 用于列表, [ 用于数组, $ 用于获取单个列或元素。如果您需要一个表达式(例如 df[[name]] 或 df[,name]),那么也可以使用 [ 或 [[ 表示法。如果选择了多列,也使用 [ 表示法。例如 df[,c('name1', 'name2')]。我认为这没有最佳实践。

于 2010-07-30T06:22:32.293 回答
9

除了手册中的索引页面外,您还可以在帮助页面上找到这个简洁的描述?“$”:

'[' 索引类似于原子向量并选择指定元素的列表。

'[[' 和 '$' 都选择列表的单个元素。主要区别在于 '$' 不允许计算索引,而 '[[' 允许。'x$name' 等价于 'x[["name", exact = FALSE]]'。此外,可以使用 'exact' 参数控制 '[[' 的部分匹配行为。

当然,函数调用是不同的。见get("[.data.frame")对比get("[[.data.frame")对比get("$")

于 2010-07-30T19:02:57.080 回答
7

在这种情况下,对于大多数用途,我会完全避免子设置并尝试记住什么$[[[使用数据框做什么。我只会使用with()

> df <- data.frame(x = 1:20, y = letters[1:20], z = 20:1)
> with(df, y)
 [1] a b c d e f g h i j k l m n o p q r s t
Levels: a b c d e f g h i j k l m n o p q r s t

在大多数情况下(恕我直言),这比任何子设置方法都要清晰得多。

于 2010-09-21T18:32:06.927 回答
6

我没有看到明确解释的一件事是,[并且[[可以用于基于变量或表达式的值进行选择,$不能。IE 你可以这样做:

> example_frame <- data.frame(Var1 = c(1,2), Var2 = c('a', 'b'))
> x <- 'Var1'

> example_frame$x
NULL  # Not what you wanted

> example_frame[x]
  Var1
1    1
2    2

> example_frame[[x]]
[1] 1 2

> example_frame[[ paste(c("V","a","r",2), collapse='') ]]
[1] a b
Levels: a b

其他帖子其他问题已经很好地涵盖了[和之间的差异。[[

于 2011-01-09T22:12:29.087 回答
5

如果你使用 df[,"x"] 而不是 df["x"] 你会得到与 df$x 相同的结果。逗号表示您正在按名称选择

于 2010-07-30T15:00:17.257 回答
0

df$xdf[[x]]做同样的事情。

假设您有一个名为 的数据集one。这些变量之一是因子变量Region。使用one$Region将允许您选择特定变量。考虑以下:

one <- read.csv("IED.csv")
one$Region

运行以下代码还允许您隔离该变量/级别。

one[["Region"]]

每个代码都会产生以下输出:

> one$Region
    [1] RC SOUTH      RC SOUTH      RC SOUTH      RC EAST       RC EAST      
    [6] RC EAST       RC EAST       RC EAST       RC EAST       RC EAST      
   [11] RC SOUTH      RC SOUTH      RC EAST       RC EAST       RC EAST      
   [16] RC EAST       RC EAST       RC SOUTH      RC SOUTH      RC EAST      
   [21] RC SOUTH      RC EAST       RC CAPITAL    RC EAST       RC EAST 


> one[["Region"]]
    [1] RC SOUTH      RC SOUTH      RC SOUTH      RC EAST       RC EAST      
    [6] RC EAST       RC EAST       RC EAST       RC EAST       RC EAST      
   [11] RC SOUTH      RC SOUTH      RC EAST       RC EAST       RC EAST      
   [16] RC EAST       RC EAST       RC SOUTH      RC SOUTH      RC EAST      
   [21] RC SOUTH      RC EAST       RC CAPITAL    RC EAST       RC EAST 

“它们都返回“相同”的结果,但不一定采用相同的格式。” - 我没有注意到任何差异。每个命令以相同的格式产生相同的输出。也许它是你的数据。

希望有帮助。

编辑:

误读了原始问题。df["x"]产生以下内容:

> one["Region"]
             Region
1          RC SOUTH
2          RC SOUTH
3          RC SOUTH
4           RC EAST
5           RC EAST
6           RC EAST
7           RC EAST
8           RC EAST
9           RC EAST
10          RC EAST

不知道为什么会出现差异。

于 2010-07-30T12:48:30.293 回答