我正遇到基地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
第二种情况下如何保留名字?
答案 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会将单列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"