来自 tibble 的向量长度为​​ 0

Vector from tibble has length 0

我有一个小问题 ('df')

> dim(df)
[1]  55 144

其中我提取了一个向量test <- c(df[,39])。我希望得到以下结果:

> length(test)
[1] 55

因为我基本上是从我的标题中提取第 39 列。相反,我得到

> length(test)
[1] 1

现在,class(test) 产生了 list,所以我认为 class 可能是原因;但是,将 class 设置为 char,我得到相同的结果。

我特别困惑,因为 length(df[39,]) 产生 [1] 155

背景是我正在使用 grep 在向量中搜索,这不适用于从列中获取的向量。当然,当我试图重新编码我的小标题中的所有行时,我可以按行而不是按列重新编码它们,所以我认为有一个解决方法。但是,是什么导致 R 假设 test 的长度为 1?行和列的处理有什么区别?

每当您对一个 tibble 应用 [] 操作时,它总是 return 是另一个 tibble。这是 tibble 结构与基础 R 中的 data.frame 之间的差异之一。

例如:

a <- 1:5
df = tibble(a,b=a*2,c=a^2)
df2 = as.data.frame(df) # convert to base data.frame
df[,2]  # give a tibble, its dim is 5 1
df2[,2] # give a vector, its dim is NULL, its length is 5. 

您看到 data.frame 中的 return 类型已从原始类型更改。同时tibble的设计保持了输入输出类型的结构一致性。

如果你想将一个tibble的特定列处理为向量,有两种方法。

  1. pull()
  2. [[ ]]

我个人使用的是pull(),也很直观。

为什么 length(df[39,]) 产生 155

我的理解是df[39,]给大家打个比方,暗淡的是1 155。它的长度等于列数。为什么?因为 length 也可以给出列表的长度。 tibble和data.frame的设计背后,都是用链表构造的。每一列实际上是一个列表。这就是为什么你可以在一个小标题或 data.frame 中有不同的类型。