在R中我试图删除数据框(蚂蚁)中的行,这些行在标题为“浊度”的列下具有负值。我试过了
ants<-ants[ants$Turbidity<0,]
但它返回以下错误:
Warning message:
In Ops.factor(ants$Turbidity, 0) : < not meaningful for factors
为什么会出现这种情况?也许我需要做出负面的价值观 在我删除所有N之前的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 ......
答案 0 :(得分:3)
Marek是对的,这是一个数据问题。现在要小心,如果你使用[as.numeric(蚂蚁$浊度),因为它总是正数。它给出因子水平(1到长度(蚂蚁$浊度)),而不是数值因子。
试试这个:
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
答案 1 :(得分:3)
在阅读数据后始终执行summary(ants)
,并检查您是否得到了您的期望。
它可以为您节省很多问题。数字数据很容易神奇地转换为字符或因子类型。
答案 2 :(得分:0)
修改即可。我忘记了as.character
转换(请参阅Joris评论)。
消息表示ants$Turbidit
是factor
。它会在你做的时候起作用
ants <- ants[as.numeric(as.character(ants$Turbidity)) > 0,]
或
ants <- subset(ants, as.character(as.numeric(Turbidity)) > 0)
但真正的问题是您的数据不准备分析。这种转换应该在一开始就完成。你应该小心,因为也可能有非数字值。
答案 3 :(得分:0)
这也可以使用tidyverse进行工作(假设列是正确的数据类型)。
ants %>% dplyr::filter(Turbidity >= 0)