[英]drop = TRUE doesn't drop factor levels in data.frame while in vector it does
在data.frame過濾中有一個有趣的選項drop = TRUE
,請參閱help('[.data.frame')
摘錄help('[.data.frame')
:
用法
類'data.frame'的S3方法
x[i, j, drop = ]
但是當我在data.frame上嘗試它時,它不起作用!
> df = data.frame(a = c("europe", "asia", "oceania"), b = c(1, 2, 3))
>
> df[1:2,, drop = TRUE]$a
[1] europe asia
Levels: asia europe oceania <--- oceania shouldn't be here!!
>
我知道還有其他方法
df2 <- droplevels(df[1:2,])
但文檔承諾更優雅的方式來做到這一點,為什么它不起作用? 這是一個錯誤嗎? 因為我不明白這是怎么一個功能......
編輯 :我對矢量的drop = TRUE
丟棄因子水平感到困惑, 你可以在這里看到 。 [i, drop = TRUE]
降低因子水平並且[i, j, drop = TRUE]
不是非常直觀!
文件明確指出:
drop:邏輯。 如果為TRUE,則將結果強制轉換為可能的最低維度。 如果只剩下一列,則默認為丟棄,但如果只剩下一行則不丟棄。
這意味着如果drop = TRUE
並且過濾的data.frame
導致單個列或行,則結果將強制轉換為向量/列表,而不是返回單列/單行data.frame
。
因此,這個參數與水平下降無關,因此消除超出水平的正確方法是你提到的(即使用droplevels
函數)。
對於許多人來說,這是一個絆腳石,因為“墮落做了不同的事情”,正如Peter Dalgaard在http://www.mail-archive.com/r-help@stat.math.ethz.ch/msg22459.html中解釋的那樣。以下是digEmAll。
如果你想要你想要的東西:
d2[] <- lapply(d2, function(x) if (is.factor(x)) factor(x) else x)
文檔說的是什么
如果為TRUE,則將結果強制轉換為可能的最低維度 。
所以它與維度有關,而與因子水平無關:
df[, 1]
# [1] europe asia oceania
# Levels: asia europe oceania
df[, 1, drop = FALSE]
# a
# 1 europe
# 2 asia
# 3 oceania
降低因子水平是一個不同的問題。 這是一個案例( ?'[.factor'
),其中為此目的出現參數drop
:
ff <- factor(c('AA', 'BA', 'CA'))
ff[1:2, drop = TRUE]
# [1] AA BA
# Levels: AA BA
DF [1:2,] $ A [,降= TRUE]
[1]歐洲亞洲
級別:亞洲歐洲
喲,所以當你嘗試使用你的方法時會發生什么,它會在原始數據框上應用掉落,所以你想要的結果不會好
所以你需要做的就是在返回的子集上應用drop ...
如果有任何疑問,請隨時ping我....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.