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

问题描述 投票:0回答:8

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

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

r dataframe lookup indexing
8个回答
17
投票

另一个区别是

df$w
返回
NULL
df['w']
df[['w']]
会在示例数据帧中给出错误。


15
投票

如果我没记错的话,

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


9
投票

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

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

‘[[’和‘$’都选择一个 列表的元素。主要的 区别在于‘$’不允许 计算索引,而“[[”则计算索引。 ‘x$name’ 等价于‘x[["name", 准确 = FALSE]]'。另外,部分 ‘[[’的匹配行为可以是 使用“精确”参数进行控制。

当然,函数调用是不同的。请参阅

get("[.data.frame")
get("[[.data.frame")
get("$")


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

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


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

[

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


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


0
投票

df$x

df[[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

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


0
投票
df["x"] 返回一个包含名为“x”的单列的数据框。这意味着结果仍然是数据帧,而不是向量。它保留了数据结构,这在某些情况下很有用。

df$x 返回包含“x”列的值的向量。这意味着结果不是数据帧,而是值向量。

© www.soinside.com 2019 - 2024. All rights reserved.