我觀察了 filter() 函式的行為,這讓我有點困擾。
我想從匹配簡單標準的小標題中選擇行,它們在特定列中有一些值。該值存盤在一個變數中。超級簡單的東西。問題是我的變數的名稱與 tibble 的列名稱相同,這會產生我沒想到的行為。
>block
[1] 41
>msg %>% filter(text == "trial_run" & block == block)
# A tibble: 42 × 4
...1 block time text
<dbl> <dbl> <dbl> <chr>
1 14 1 1149175 trial_run
2 30 2 1164422 trial_run
3 46 3 1193408 trial_run
4 62 4 1199713 trial_run
5 78 5 1211763 trial_run
6 94 6 1218312 trial_run
7 110 7 1222947 trial_run
8 126 8 1236795 trial_run
9 142 9 1247513 trial_run
10 158 10 1254297 trial_run
# … with 32 more rows
我假設 block == block 會產生像 1 == 1 這樣的同義反復,因此我的塊標準沒有被應用。一個簡單的解決方案就是更改塊變數的名稱。
> blk <- block
> msg %>% filter(text == "trial_run" & block == blk)
# A tibble: 1 × 4
...1 block time text
<dbl> <dbl> <dbl> <chr>
1 654 41 1513347 trial_run
但是我覺得這種情況可能會導致我在未來遇到一個難以追蹤的錯誤。我究竟做錯了什么?我將來如何避免這個問題(除了制作唯一的變數和列名)?
uj5u.com熱心網友回復:
該過濾器命令有.data和.env“代名詞”,你可以用它來弄清楚其中的變數是從哪里來的。嘗試
msg %>% filter(text == "trial_run" & .data$block == .env$block)
這.data意味著它來自 data.frame,.env意味著它是來自環境的值。您可以在rlang 幫助中閱讀更多相關資訊。在那個頁面上有一個這樣的例子。
uj5u.com熱心網友回復:
我們要么逃避 !!
library(dplyr)
block <- 4
msg %>%
filter(text == "trial_run" & block == !!block)
-輸出
...1 block time text
4 62 4 1199713 trial_run
或者可以從 globalenv 訪問變數
msg %>%
filter(text == "trial_run" & block == .GlobalEnv$block)
-輸出
...1 block time text
4 62 4 1199713 trial_run
資料
msg <- structure(list(...1 = c(14L, 30L, 46L, 62L, 78L, 94L, 110L, 126L,
142L, 158L), block = 1:10, time = c(1149175L, 1164422L, 1193408L,
1199713L, 1211763L, 1218312L, 1222947L, 1236795L, 1247513L, 1254297L
), text = c("trial_run", "trial_run", "trial_run", "trial_run",
"trial_run", "trial_run", "trial_run", "trial_run", "trial_run",
"trial_run")), class = "data.frame", row.names = c("1", "2",
"3", "4", "5", "6", "7", "8", "9", "10"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/347591.html
上一篇:您可以使用.SDcols對data.table中的行進行子集化嗎
下一篇:按組用數字序列填充NA
