簡體   English   中英

drop = TRUE不會降低data.frame中的因子級別,而它在向量中也是如此

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM