[英]Error message when using Dplyr to filter with more than 3 levels to a factor
我正在嘗試過濾Dplyer中的一些因素,但是我沒有手動寫出我想要的因素,例如c(“ Blue”,“ Green”,“ White”)等,
levels(df$factor.variable)[1:3]
可能會證明速度更快,但是如果嘗試使用以下代碼選擇兩個以上的變量,則會收到錯誤消息“較長的對象長度不是較短的對象長度的倍數” ,並且不會傳遞大量數據。 在下面的虛擬數據中,2/3的數據消失了。
a <- 1:20
b <- rep(c("Blue", "Green", "White", "Grey"),5)
df <- data.frame(Numbers=a, colours=b)
df %>%
select(Numbers, colours) %>%
filter(colours==levels(df$colours)[1:3])
請注意,如果僅選擇以上級別的1或2(如[1]或[1:2],而不是[1:3]),則不會出現此問題。 另外,如果我刪除了一種顏色(因素),那么我就不再有問題了。
a <- 1:15
b <- rep(c("Blue", "Green", "White"),5)
df <- data.frame(Numbers=a, colours=b)
df %>%
select(Numbers, colours) %>%
filter(colours==levels(df$colours)[1:3])
哪些對象的長度更長或更短? 為何2/3的數據消失了?
您在dplyr中犯了錯誤。 代替==使用%in%解決了該錯誤。
a <- 1:20
b <- rep(c("Blue", "Green", "White", "Grey"),5)
df <- data.frame(Numbers=a, colours=b)
str(df)
df2<- df %>%
select(Numbers, colours) %>%
filter(colours %in% levels(df$colours)[1:3])
實際上,這不是dplyr
問題。
正如其他提到的, a == b
檢查每對元素是否相同,即a[1] == b[1]
, a[2] == b[2]
,依此類推。 (看一下?Comparison
。)您正在比較長度不相等的向量和長度不適合於循環使用一個向量以適應另一個向量的向量,這就是發出警告的原因。
相反, a %in% b
檢查是否在每個元素a
存在於某處b
,以及每個元素返回true或false a
。
為了說明您的數據:
library(dplyr)
a <- 1:20
b <- rep(c("Blue", "Green", "White", "Grey"),5)
df <- data.frame(Numbers=a, colours=b)
在a %in% b
表示中,這是您的b
:
levels(df$colours)[1:3]
#> [1] "Blue" "Green" "Grey"
檢查該值集中的每個colours
元素會產生一個邏輯向量:
df$colours %in% levels(df$colours)[1:3]
#> [1] TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE
#> [12] TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE
dplyr::filter
的基本R版本是這樣的,它采用df$colours
的元素,先前的操作會得出TRUE
:
df$colours[df$colours %in% levels(df$colours)[1:3]]
#> [1] Blue Green Grey Blue Green Grey Blue Green Grey Blue Green
#> [12] Grey Blue Green Grey
#> Levels: Blue Green Grey White
在dplyr
,非標准評估會減少對df$
的需求,但您在dplyr::filter
所做的事情基本上相同:查找colours
每個元素是否在值levels(colours)[1:3]
的子集中,然后僅過濾與TRUE
相對應的那些行。
df %>%
filter(colours %in% levels(colours)[1:3])
#> Numbers colours
#> 1 1 Blue
#> 2 2 Green
#> 3 4 Grey
#> 4 5 Blue
#> 5 6 Green
#> 6 8 Grey
#> 7 9 Blue
#> 8 10 Green
#> 9 12 Grey
#> 10 13 Blue
#> 11 14 Green
#> 12 16 Grey
#> 13 17 Blue
#> 14 18 Green
#> 15 20 Grey
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.