在R中,“df['x']”和“df$x”有什么区别?

19

我可以在哪里找到有关以下两种方法从data.frame中调用列之间的区别的信息:

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

df$x
df["x"]
他们都返回“相同”的结果,但格式可能不同。我注意到的另一件事是,df$x 返回一个列表,而 df["x"] 返回一个数据框。然而,知道在哪种情况下使用哪个似乎成为了一个挑战。这里是否有最佳实践,或者它真的归结于知道命令或函数需要什么?到目前为止,如果我的函数一开始不起作用(试错法),我已经开始轮流使用它们了。
7个回答

17

另一个区别是,在你的示例数据框中,df$w 返回 NULL,而 df['w']df[['w']] 则会出现错误。


是的,一个考虑因素是如果您拼错了列名是否希望它静默失败。在开发过程中,这通常是非常不可取的,因此您需要捕获错误。 - smci

15

如果我没有理解错误,df$xdf[['x']]相同。[[用于选择任何单个元素,而[返回所选元素的列表。另请参见语言参考手册。我通常看到[[用于列表,[用于数组,$用于获取单个列或元素。如果需要表达式(例如df[[name]]或df[,name]),则也可以使用[或[[符号。如果选择多个列,则还使用[符号。例如df[,c('name1','name2')]。我认为没有最佳实践。


如果 df <- data.frame(xx = 1); df$x != df[['x'] 就像我在这里发现的一样:http://stackoverflow.com/q/17349485/199217 - David LeBauer

9
除了手册中的索引页面外,您还可以在帮助页面“$”上找到这个简明描述:
用“[”进行索引与原子向量类似,并选择指定元素的列表。
“[[”和“$”都选择列表的单个元素。主要区别在于,“$”不允许计算索引,而“[[”允许。“x$name”等同于“x[[“name”,exact = FALSE]]”。此外,“[[”的部分匹配行为可以使用“exact”参数进行控制。
函数调用当然是不同的。请参见get(“[.data.frame”)get(“[[.data.frame”)get(“$”)

7
在大多数情况下,我建议避免使用子集(sub-setting),并尝试记住 $[[[ 在数据框中的作用。相反,我会使用 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

在大多数情况下(依我看来),这比大多数子集方法都要清晰明了。


6

有一件事情我没有看到有明确解释,那就是[[[可以根据变量或表达式的值进行选择,而$不行。也就是说,你可以这样做:

> 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

其他帖子和问题已经详细介绍了[[[之间的区别,参见这里这里


1
奇怪的是,*example_frame$'Var1'* 可以工作,但 example_frame$x 失败了。 - smci

5

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


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

不确定为什么会出现这种差异。


你没有注意到任何差异,因为你看的是与他所问的略有不同的东西。问题是关于 df$x 和 df["x"](单括号)之间的区别,但你谈论的是 df$x 和 df[["x"]](双括号)。 - Fojtasek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接