【问题标题】:Delete rows with negative values删除具有负值的行
【发布时间】:2010-11-18 10:49:16
【问题描述】:

在 R 中,我试图删除数据框(蚂蚁)中在列标题浊度下具有负值的行。我试过了

ants<-ants[ants$Turbidity<0,]

但它返回以下错误:

Warning message:
In Ops.factor(ants$Turbidity, 0) : < not meaningful for factors

任何想法为什么会这样?也许我需要制作负值 NA,然后我删除所有 NA?

任何想法都非常感谢,谢谢!

@Joris:结果是

str(ants$Turbidity)

num [1:291] 0 0 -0.1 -0.2 -0.2 -0.5 0.1 -0.4 0 -0.2 ...

【问题讨论】:

  • 我认为您在写 &lt; 时的意思是 &gt;
  • 是的,你说的很对,我的错误,我认为的错误之一!
  • 我指的是原始的蚂蚁$Turbidity,而不是转换后的蚂蚁。你在这里给出的那个不能给出那个错误。但是正如您自己指出的那样,使用header=T 似乎可以解决它,所以不要打扰。

标签: r row


【解决方案1】:

Marek 是对的,这是数据问题。现在如果你使用 [as.numeric(ants$Turbidity] 时要小心,因为那个总是正数。它给出了因子水平(1 到 length(ants$Turbidity)),而不是数字因子。

试试这个:

tt <- as.numeric(as.character(ants$Turbidity))
which(!is.na(tt))

它会给你一个索引列表,其中值首先不是数字。这应该使您能够首先清理数据。

例如:

> Turbidity <- factor(c(1,2,3,4,5,6,7,8,9,0,"a"))
> tt <- as.numeric(as.character(Turbidity))
Warning message:
NAs introduced by coercion 
> which(is.na(tt))
[1] 11

您不应该使用 as.numeric(as.character(...)) 结构来转换有问题的数据,因为它会生成 NA,这会与其余部分混淆。例如:

> Turbidity[tt > 5]
[1] 6    7    8    9    <NA>
Levels: 0 1 2 3 4 5 6 7 8 9 a

【讨论】:

  • 谢谢 Joris 和 Marek。我已经按照建议运行了它,实际上我的所有行都作为字符返回,至少没有一个作为数字返回。现在我已经确定我的数据格式完全错误,你能建议我如何将它们更改为数值还是不是那么简单?非常感谢。
  • @Joey:所以你的意思是在 which(!is.na(tt)) 之后你会得到一个从 1 到行数的列表?如果是这样,您能否将str(ants$Turbidity) 的输出放在您的问题中?
  • 嗯?那是一个数字向量。如您所描述的,您不会从中得到错误。但是您自己指出问题出在列标题上,所以我猜使用选项header=T 解决了问题。
【解决方案2】:

在读入数据后总是做summary(ants),并检查你是否得到了你所期望的。

它将为您节省很多问题。数值数据很容易神奇地转换为字符或因子类型。

【讨论】:

  • 天哪,我现在看到我的所有数据列(全是数字)都没有导入为数字。我觉得在导入它们时我错过了一些基本的东西。请问如何指定我希望某些列是日期、时间或数字?
  • @Spacedman:转换没有什么神奇之处。如果它被转换为字符或因子类型,首先是数据有问题。
  • @Joey :转换是由于数据集中存在非数字字符这一事实。如果可能的话,R 会让它们变成数字。您必须删除那些非数字字符。
  • @Joey 你是怎么读的?也许您选择了错误版本的read.csv?请参阅read.table 的帮助和colClasses 参数的说明。
  • @Spacedman 我通常使用str,因为在大型数据集上summary 可能是矫枉过正。
【解决方案3】:

编辑。我忘记了 as.character 转换(请参阅 Joris 评论)。


消息意味着ants$Turbiditfactor。当你这样做时它会起作用

ants <- ants[as.numeric(as.character(ants$Turbidity)) > 0,]

ants <- subset(ants, as.character(as.numeric(Turbidity)) > 0)

但真正的问题是您的数据还没有准备好进行分析。这种转换应该在一开始就完成。您应该小心,因为也可能存在非数字值。

【讨论】:

  • as.numeric 将给出因子水平,而不是数值。如果你使用as.numeric(as.character(ants$Turbidity)),你会遇到`NA`的问题。
  • 谢谢,这很好用,我意识到我实际上想要保持一切大于或等于 0.0。当你说这种类型的转换应该在开始时......在什么开始?抱歉,我对 R 还很陌生,不习惯一些最佳实践……谢谢 :)
  • @Joris 很明显,但我错过了。谢谢。
【解决方案4】:

这也应该使用 tidyverse 工作(假设列是正确的数据类型)。

ants %>% dplyr::filter(Turbidity >= 0)

【讨论】:

    猜你喜欢
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2022-06-13
    • 1970-01-01
    • 2021-12-14
    相关资源
    最近更新 更多