我有一个小标题('df')
> dim(df)
[1] 55 144
我提取了一个向量test <- c(df[,39])
。我希望得到以下结果:
> length(test)
[1] 55
因为我基本上是从小标题中取出第39列。相反,我得到了
> length(test)
[1] 1
现在,class(test)
产生了list
,所以我认为上课可能是原因;但是,如果将类设置为char
,我将得到相同的结果。
我特别困惑,因为length(df[39,])
产生[1] 155
。
背景是我正在使用grep
搜索向量,但不适用于从列中获取的向量。当然,当我尝试重新编码标题中的所有行时,我可以按行而不是按列对它们进行编码,因此我认为有一种解决方法。但是,是什么导致R假定test
的长度为1?处理行和列有什么区别?
答案 0 :(得分:1)
每当对小标题应用[]
操作时,它总是返回另一个小标题。这是基本结构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的返回类型已从原始类型更改。同时,小标题以这种方式设计,以保持输入和输出类型之间的结构一致性。
有两种方法,如果要将小标题的某些列作为矢量处理。
pull()
[[ ]]
我个人使用pull()
,这也非常直观。
为什么length(df[39,])
会产生155
?
我的理解是,df[39,]
给了您一点小声,它的暗淡为1 155
。其长度等于列数。为什么?因为length也可以给出列表的长度。在tibble和data.frame设计的背后,它们是由链表构造的。每列实际上是一个列表。这就是为什么您可以在一个小标题或data.frame中使用不同类型的原因。