【问题标题】:In R, What is the difference between df["x"] and df$x在 R 中,df["x"] 和 df$x 有什么区别
【发布时间】:2011-03-23 02:13:55
【问题描述】:

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


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    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"]] (双括号)。
    【解决方案3】:

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

    【讨论】:

    • 是的,一个考虑因素是如果您拼错列名,是否希望它静默失败。在开发过程中,这通常是非常不可取的,因此您需要捕获错误。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        【解决方案6】:

        在这种情况下,对于大多数用途,我会完全避免子设置并尝试记住 $[[[ 对数据框的作用。我只会使用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
        

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

        【讨论】:

          【解决方案7】:

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

          > 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
          

          [[[ 之间的差异已经被 other postsother questions 很好地覆盖了。

          【讨论】:

          • 奇怪的是,example_frame$'Var1' 有效,但 example_frame$x 失败。
          猜你喜欢
          • 2018-10-22
          • 1970-01-01
          • 2020-05-26
          • 2020-08-13
          • 2022-01-01
          • 2019-03-18
          • 2022-11-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多