【问题标题】:subsetting a dataframe in R - unexpected results在 R 中对数据框进行子集化 - 意外结果
【发布时间】:2015-11-08 17:17:17
【问题描述】:

好的,找不到更好的标题

假设我有 my_dataframe:

Name Value1 Value2
AA    10     20
BB    15     30

如果我这样做: nrow(my_dataframe[my_dataframe$Value2>20,] 结果我得到'1'

我想创建my_second_dataframe,比如只有'Value2'列:

my_second_dataframe<- my_dataframe[,'Value2', drop=FALSE]

让我看看:

class(my_second_dataframe)
[1] "data.frame"
class(my_second_dataframe$Value2)
[1] "numeric"

然后:

nrow(my_second_dataframe[my_second_dataframe$Value2>20,]
NULL

????? 这将是一个函数的一部分,我想在其中隔离一个选择的列,并根据阈值数获取该列的行数。我做错了什么?

谢谢

【问题讨论】:

  • 在第一种情况下你使用drop=FALSE,为什么你没有在第二种情况下使用my_second_dataframe[my_second_dataframe$Value2&gt;20,, drop=FALSE]因为只有一列,它从data.frame转换为vector .或者你可以使用subset(my_second_dataframe, Value2&gt;20)
  • 您好,谢谢。添加 'drop=FALSE' 确实有效。不过我还是不明白。当我检查原始数据集的行号时,我不需要指定 drop 参数。此外,我不信任子集函数(请参阅警告)
  • 默认情况下,在subset 中为drop=FALSE,但如果您使用[,则为drop=TRUE。您可以从?Extract查看更多详情
  • 好的,我再次阅读了您的第一条评论,我的错。我已经为 my_second_dataframe 添加了一个列,现在该命令无需添加 drop 即可工作。所以,基本上,当只有一列时,它会从 data.frame 转换为 vector (如你所说......)。我不知道! 好吧,感谢您的帮助 :) 很遗憾,我无法将评论标记为已接受的答案。
  • 除了 akrun 的评论之外,您可能还会发现有用的 ?NROW(而不是 nrow

标签: r dataframe subset


【解决方案1】:

基于?Extract中的文档

drop :用于矩阵和数组。如果为 TRUE,则结果被强制为 尽可能低的维度(参见示例)。这仅适用于 提取元素,而不是用于替换。进一步看下降 详情。

另外,对于[,默认情况下是drop = TRUE

x[i, j, ... , drop = TRUE]

因此,我们需要指定drop = FALSE 以避免在只有单个列或行时强制转换为可能的最低维度。

在 OP 的例子中

my_second_dataframe[my_second_dataframe$Value2>20,, drop=FALSE]

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2020-04-26
    • 2018-06-21
    • 2017-07-29
    相关资源
    最近更新 更多