只有一列时,如何获取具有名称的数据框的第一行?

时间:2019-11-21 09:15:09

标签: r dataframe vector

我正遇到基地R的意外行为。

我想使用其同名作为向量来检索数据框的第一行,并且这种通用方法在大多数情况下都可以正常工作。

df = data.frame(A=c(12,13), B=c(24,25))
unlist(df[1,]) #class=numeric
#    A  B
#   12 24

但是当数据帧仅由一列组成时,结果将强制为一个未命名的向量:

df = data.frame(A=c(12,13))
unlist(df[1,]) #class=numeric too
# 12

第二种情况下如何保留名字?

4 个答案:

答案 0 :(得分:5)

默认情况下,使用[提取数据帧时,drop参数为TRUE

来自?Extract

  

drop-如果为TRUE,则将结果强制为最小尺寸。

也可以在提取行之后检查两个数据框的类。

df1 = data.frame(A=c(12,13), B=c(24,25))
df2 = data.frame(A=c(12,13))

class(df1[1, ])
#[1] "data.frame"
class(df2[1, ])
#[1] "numeric"

我们可以看到df2被强制为向量。使用drop = FALSE会将其保留为数据框,并且不会丢失尺寸。

df2[1,, drop = FALSE]
#   A
#1 12

class(df[1,, drop = FALSE])
#[1] "data.frame"

答案 1 :(得分:4)

如果要使用命名向量,则提取单列数据帧可能会比较棘手。可能的解决方法是

do.call(c, df)[1]
#A1 
#12 

在哪里

str(do.call(c, df)[1])
 Named num 12
 - attr(*, "names")= chr "A1"

请注意,由于它将所有值都转换为命名向量,因此会在名称后添加数字后缀,这样就不会重复名称

答案 2 :(得分:2)

这是R的默认行为。

默认情况下,R会将单列data.frames转换为vectors(带有drop = TRUE)。在处理drop = FALSE时,最好使用选项data.frames。这样可以确保数据类型不会更改。

所以,而不是:

df[1,]

使用:

df[1, , drop = FALSE]

希望这会有所帮助。

答案 3 :(得分:2)

来自dplyr

?slice

  

按行序选择行


library(dplyr)
slice(df, 1L)

#   A
#1 12

str(slice(df, 1L))
# 'data.frame': 1 obs. of  1 variable:
#$ A: num 12

如果您希望将其作为命名号码,则可以unlist

str(unlist(slice(df, 1L)))
#Named num 12
# - attr(*, "names")= chr "A"

您也可以转置它以保留列名。

colnames(t(unlist(slice(df, 1L))))

#"A"