r - 在 R 中,选择向量时 [[X]] 和 [, X] 有什么区别

标签 r vector dplyr

library(tidyverse)
df0 <- data.frame(col1 = c(5, 2), col2 = c(6, 4))
df1 <- data.frame(col1 = c(5, 2), 
                  col2 = c(6, 4),
                  col3 = ifelse(apply(df0[, 1:2], 1, sum) > 10 & 
                                  df0[, 2] > 5, 
                                "True",
                                "False"))
df2 <- as_tibble(df1)

我在上面得到了我的数据框 df1。我基本上将其“复制”为小标题 df2。让我们模拟对此 df1 数据框和 df2 tibble 的分析。

identical(df1[[2]], df1[, 2])
# [1] TRUE
identical(df2[[2]], df2[, 2])
# [1] FALSE

因为 df1df2 本质上是“相同的”,为什么我在上面的代码块中得到了 TRUE/FALSE 二分法。发生变化的 tibble() 属性是什么?

同样的问题以另一种方式提出 - [[X]][, X] 有什么区别,应用于基础 R 时,以及使用时在 tidyverse 中?

最佳答案

由于所有列表都是向量,我们可以从列表子集的角度来考虑这一点。举个例子:

L <- list(A = c(1, 2), B = c(1, 4))
L[[2]]

提取是列表的第二个元素。将此推断为:

df1[[2]] 

我们得到与 df1[, 2] 相同的输出,因此 identical(df1[[2]], df1[, 2]) 返回 TRUE。 第二部分是关于 tibble 结构的,即:

typeof(as_tibble(df1)[[2]])
[1] "double"
typeof(as_tibble(df1[, 2]))
[1] "list"

第二个是列表,而第一个是一个向量,因此identical返回FALSE

类 tbl_df 的对象有:(来自文档)

c("tbl_df", "tbl", "data.frame") 的类属性。

“列表”的基本类型,其中列表的每个元素都具有相同的 NROW()。

一个名称属性,它是一个与底层列表长度相同的字符向量。

一个 row.names 属性,用于与基本 data.frame 类兼容。仅查询此属性以查询行数,大多数 tibble 方法都会忽略可能存储在那里的任何行名称。

关于r - 在 R 中,选择向量时 [[X]] 和 [, X] 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55869141/

相关文章:

R 代码运行时间太长

c++ - 尝试将代码简化为移动语义的基于范围的 for 循环时,不匹配 ‘operator[]'

r - 绑定(bind)/合并两个具有不同行数的数据框

r - 向数据框的所有列添加千位分隔符

r - 类型为 'envir' 的参数无效 'character' -- 在带有晶格直方图的自定义函数中

r - 识别与从PCA和QQ图去除离群

r - 箱线图 - 使用变量访问列名

c++ - 从对象 vector 调用虚拟函数的模板版本

c++ - 与观察者指针共享指针

r - 将向量中的字符值转换为数值