r - 子集化数据帧创建因子

时间:2017-12-09 19:36:15

标签: r dataframe subset

我有一个巨大的数据框(称之为huge)我希望按行号分成两部分。虽然,我注意到我的方式使得结果子集成为大因子而不是数据帧。

list1 <- huge[c(1:8175),]
list2 <- huge[c(8176:nrow(huge),]

class(list1)
[1] "factor"

有人可以向我解释为什么会这样,我该如何防止这种情况?

1 个答案:

答案 0 :(得分:1)

您可能会对单列数据框进行子集化。考虑以下示例。

# Create an example data frame
dt <- data.frame(a = 1:5, b = letters[1:5])
dt

#   a b
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
# 5 5 e

str(dt)

# 'data.frame': 5 obs. of  2 variables:
#  $ a: int  1 2 3 4 5
#  $ b: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5

# Subset the data frame
list1 <- dt[1:2, ]
list2 <- dt[3:nrow(dt), ]

class(list1)
# [1] "data.frame"

子集dt的代码效果很好。但是,当我从dt创建一个单列数据帧并对其进行子集时,您可以看到输出自动变为向量。

# Create a one-column data frame
dt2 <- dt[, 2, drop = FALSE]

# Subset the data frame
list3 <- dt2[1:2, ]
list4 <- dt2[3:nrow(dt2), ]

class(list3)
# [1] "factor"
list3
# [1] a b
# Levels: a b c d e

在对数据帧进行子集化时,解决方案是添加drop = FALSE以将输出保持为数据帧。

# Subset the data frame
list5 <- dt2[1:2, , drop = FALSE]
class(list5)
# [1] "data.frame"