从数据框中删除级别失败

时间:2015-09-28 01:05:59

标签: r

我正在尝试对数据帧列进行计算,但它们仍然失败,因为尽管我使用了droplevels命令(来自this post),但该列包含级别。我在这做错了什么:

csv <- data.frame(col1 = c("question",1,23,2,5,6), col2 = c("question",5,6,7,3,""))
csv[csv==''] <- NA
csv <- csv[-c(1),] #remove the header question row because this screws up numeric calculations
csv <- droplevels(csv)
csv[,1] <- 7-csv[,1]

我明白了:

Warning message:
In Ops.factor(7, csv[, 1]) : ‘-’ not meaningful for factors

1 个答案:

答案 0 :(得分:5)

删除级别是一种不同的命令。你不再需要因素。尝试as.numeric(as.character(mycol))准备算术列。

csv[] <- lapply(csv, function(x) as.numeric(as.character(x)))

我将其包装在lapply中以转换所有列。

结果:

csv[,1] <- 7-csv[,1]
  col1 col2
2    6    5
3  -16    6
4    5    7
5    2    3
6    1   NA

当我们有未使用的因素时,我们会降低水平。不要将它们转换为数字。例如:

fac <- factor(c("a", "b")) #factor with two levels 'a' and 'b'
fac
#[1] a b
#Levels: a b

fac.one <- fac[1] #Just the first element of 'fac' which is 'a'.
fac.one
#[1] a
#Levels: a b       # <-- There are still two levels. 'b' is not used.

当我们制作fac.one时,我们只有一个元素。但旧的因素水平仍然存在。如果我们只想要在对象中使用的因子,我们使用droplevels,如下所示:

droplevels(fac.one)
#[1] a
#Levels: a     #One factor remains. 'b' is dropped