我正在尝试对数据帧列进行计算,但它们仍然失败,因为尽管我使用了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
答案 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