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

时间:2010-07-30 06:05:20

标签: r dataframe lookup indexing

我在哪里可以找到有关通过以下方式调用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。

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

7 个答案:

答案 0 :(得分:16)

另一个区别是df$w返回NULLdf['w']df[['w']]会对您的示例数据框造成错误。

答案 1 :(得分:14)

如果我没弄错的话,df$xdf[['x']]相同。 [[用于选择任何单个元素,而[返回所选元素的列表。另见the language reference。我经常看到[[用于列表,[用于数组和$用于获取单个列或元素。如果你需要一个表达式(例如df [[name]]或df [,name]),那么使用[或[[表示法也是。如果选择了多个列,也会使用[表示法。例如df [,c('name1','name2')]。我认为没有最好的做法。

答案 2 :(得分:9)

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

  

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

     

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

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

答案 3 :(得分: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

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

答案 4 :(得分:6)

我未明确解释过的一件事是[[[可以用根据变量或表达式的值进行选择{{1不能。你可以这样做:

$

other postsother questions很好地涵盖了> 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 [之间的差异。

答案 5 :(得分:5)

如果你使用df [,“x”]而不是df [“x”],你将获得与df $ x相同的结果。逗号表示您按名称选择

答案 6 :(得分: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

不确定为何会出现差异。