从数据框中删除级别失败

Ril*_*n42 0 r

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

Pie*_*une 5

删除级别是一种不同的命令.你不再需要因素.尝试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)