删除行不会更改length()和levels()的更改输出

时间:2017-09-28 20:17:55

标签: r row

使用下面的代码我导入数据集,浏览它并删除一行。 删除行后,我的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命令的输出与之前相同。我究竟做错了什么?

2 个答案:

答案 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