使用下面的代码我导入数据集,浏览它并删除一行。 删除行后,我的length和levels命令的输出不变。为什么?
myserver.com/path/to/file/
这是输出:
[1] 3
[1]“33529”“K”“M”
出了点问题。我调查了性别值为33529
的行MT <- read_csv("Q:/PhD/PhD courses/Data Doc and Man/day3-day4/bromraw.txt",
col_names = FALSE)
names(MT) <- c("id","pnr","age","sex", "runtime")
MT$sex <- as.factor(MT$sex)
length(levels(MT$sex))
levels(MT$sex)
在检查行后,我决定放弃它,并再次重新检查性别变量。
filter(MT, sex == 33529)
[1] 3
[1]“33529”“K”“M”
当我浏览数据时,该行不存在,但length和levels命令的输出与之前相同。我究竟做错了什么?
答案 0 :(得分:2)
这可能是未使用级别的情况。我们可以通过降低级别
来解决它MT <- droplevels(subset(MT, sex != 33529))
答案 1 :(得分:2)
我觉得这个问题不仅仅是一段代码,而是一个更好的解释。
因子水平可以独立于数据而存在,例如
x <- factor(character(0), levels = LETTERS[1:3])
创建一个长度为0的向量,它有3个因子级别
x
factor(0) Levels: A B C
向量length(x)
的长度为零,但x
有3个级别
levels(x)
[1] "A" "B" "C"
(并且length(levels(x))
相应地为3。
好处是我们可以稍后添加数据,如果它与定义的因子水平兼容,则检查数据:
x[1:4] <- LETTERS[1:4]
警告讯息:在
[<-.factor
(*tmp*
,1:4,值= c(&#34; A&#34;,&#34; B&#34;, &#34; C&#34;,&#34; D&#34;)):无效因子水平,NA生成
x
[1] A B C <NA> Levels: A B C
现在,向量由4个元素(length(x)
)组成,但仍然只有3个因子级别。请注意,"D"
并未自动成为额外的因素级别,而是替换为NA
。
如果移除了矢量的元素,例如
y <- x[-c(1L, 4L)]
y
[1] B C Levels: A B C
因子水平保持不变,而length(y)
现在为2。
但是,如果您要删除未使用的因子级别,可以使用droplevels()
函数as pointed out by akrun明确删除:
y <- droplevels(y)
y
[1] B C Levels: B C
现在,因子级别"A"
已被删除,因为它未被使用。
虽然levels()
函数显示了已定义的因子级别,但它不会告知哪些框(信用额度为Acccumulation)已填充或未填写。 unique()
函数返回不同值的向量,而table()
函数计算出现次数:
set.seed(1L)
z <- sample(LETTERS[1:8], 10, replace = TRUE)
z
[1] "C" "B" "E" "H" "A" "B" "D" "A" "D" "C"
unique(z)
[1] "C" "B" "E" "H" "A" "D"
table(z)
z A B C D E H 2 2 2 2 1 1