我正在尝试对数据帧列进行计算,但它们仍然失败,因为尽管我使用了droplevels命令(从这篇文章中),该列包含级别.我在这做错了什么:
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]
Run Code Online (Sandbox Code Playgroud)
我明白了:
Warning message:
In Ops.factor(7, csv[, 1]) : ‘-’ not meaningful for factors
Run Code Online (Sandbox Code Playgroud)
删除级别是一种不同的命令.你不再需要因素.尝试as.numeric(as.character(mycol))准备算术列.
csv[] <- lapply(csv, function(x) as.numeric(as.character(x)))
Run Code Online (Sandbox Code Playgroud)
我把它包起来lapply转换所有列.
结果:
csv[,1] <- 7-csv[,1]
col1 col2
2 6 5
3 -16 6
4 5 7
5 2 3
6 1 NA
Run Code Online (Sandbox Code Playgroud)
当我们有未使用的因素时,我们会下降.不要将它们转换为数字.例:
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.
Run Code Online (Sandbox Code Playgroud)
当我们制作时fac.one,我们只有一个元素.但旧的因素水平仍然存在.如果我们只想要在对象中使用的因子,我们使用droplevels如下:
droplevels(fac.one)
#[1] a
#Levels: a #One factor remains. 'b' is dropped
Run Code Online (Sandbox Code Playgroud)