在R中,df ["x"]和df $ x之间有什么区别

Bra*_*sen 18 lookup indexing r dataframe

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

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

df$x
df["x"]
Run Code Online (Sandbox Code Playgroud)

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

编辑:然而,知道在哪种情况下使用哪一个已经成为一个挑战.这里有最好的做法,还是真的要知道命令或功能需要什么?到目前为止,如果我的功能最初不起作用(试错),我就一直在骑自行车.

Hen*_*ico 16

另一个区别是df$w返回NULL和/ df['w']df[['w']]给出了示例数据帧的错误.


Sig*_*gyF 14

如果我没有弄错,df$x就像是一样df[['x']].[[用于选择任何单个元素,而[返回所选元素的列表.另请参阅语言参考.我经常看到[[用于列表,[用于数组和$用于获取单个列或元素.如果你需要一个表达式(例如df [[name]]或df [,name]),那么使用[或[[表示法也是.如果选择了多个列,也会使用[表示法.例如df [,c('name1','name2')].我认为没有最好的做法.


jve*_*ani 9

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

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

两个'[['和'$'选择列表中的单个元素.主要的区别是'$'不允许计算指数,而'[''.'x $ name'相当于'x [["name",exact = FALSE]]'.此外,'[['的部分匹配行为可以使用'exact'参数控制.

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


Rei*_*son 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
Run Code Online (Sandbox Code Playgroud)

在大多数情况下(IMHO),这比任何子设置方法都要清晰得多.


Sha*_*pie 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
Run Code Online (Sandbox Code Playgroud)

之间的差异[,并[[已通过了很好的覆盖其他职位其他问题.


小智 5

如果你使用df [,"x"]代替df ["x"],你将获得与df $ x相同的结果.逗号表示您正在按名称选择.