【问题标题】:r - subsetting dataframe creates factorsr - 子集数据框创建因子
【发布时间】:2017-12-09 19:36:15
【问题描述】:

我有一个巨大的数据框(称之为huge)我想按行号分成两部分。不过,我注意到我这样做的方式使结果子集成为大因素而不是数据框。

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

class(list1)
[1] "factor"

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

【问题讨论】:

  • 显示您的数据框huge的最小可重现示例。
  • 你为什么不在那个对象上试试as.data.frame,看看tit是否能把它转换回那个格式? www 也是正确的,向我们展示了一个可以使用的示例
  • 请使用dput(huge[1:15,]) 之类的内容展示您的示例并将结果粘贴到您的问题中。

标签: r dataframe subset


【解决方案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"

【讨论】:

  • 我现在明白了。我刚刚发现的另一个解决方案是使用head() 或tail()。
猜你喜欢
  • 2018-09-23
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多