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

时间:2019-04-26 13:53:33

标签: 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的小节的分析。

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

由于df1df2本质上是“相同”的,所以为什么在上面的代码块中得到TRUE / FALSE二分法。已更改的tibble()属性是什么?

同一个问题提出了另一种方式-[[X]][, X]之间的区别是什么,当应用于基数R时,以及在整联中使用时,

1 个答案:

答案 0 :(得分:3)

由于所有列表都是向量,因此我们可以从列表子集的角度来考虑。例如:

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

Extract是列表的第二个元素。推断为:

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"

第二个是list,而first是向量,因此identical返回FALSE

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

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

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

名称属性,它是与基础列表长度相同的字符向量。

一个row.names属性,为了与基础data.frame类兼容而包括在内。仅在查询行数时才查询该属性,大多数tibble方法都会忽略可能存储在其中的任何行名。