我正在使用這個資料集filter()的函式(在庫中dplyr)。它包含一個名為“depth_m”的變數,它是數字的,我將它轉換為一個字符類(見下面的代碼),我沒有問題。sapply
現在變數是一個字符,但是,當我根據“depth_m”變數過濾資料集時,無論是==“20”(作為一個字符)還是==20(作為一個數字)我得到了相同的結果所以..應該按數字(== 20)過濾時不會出錯嗎?
這是我的代碼:
data <- read.table("env.txt", sep = "\t", header = TRUE)
class(data$depth_m)
輸出:
[1] "integer"
# Variable transformation
data$depth_m <- sapply(data$depth_m, as.character)
class(data$depth_m)
輸出:
[1] "character"
檢查資料型別:
class(data$depth_m)
輸出:
[1] "1000" "500" "20" "1" "1000" "500" "20" "1" "1000" "320" "1" "20" "1"
[14] "20" "1" "120" "20" "20" "365" "20" "1" "375" "20" "1" "1000" "500"
[27] "20" "1" "200" "20" "1" "1000" "500" "25" "1" "1000" "500" "25" "1"
[40] "20" "300" "20" "1000" "20"
我在這里過濾。在這段代碼中,我希望得到一些子資料集,因為值“20”是一個字符,它是正確的,因為它存在于原始資料集中。
y <- filter(data, depth_m == "20") %>%
select(env_sample, depth_m)
head(y)
輸出:
env_sample depth_m
1 Jan_B16_0020 20
2 Jan_B08_0020 20
3 Mar_M03_0020 20
4 Mar_M04_0020 20
5 Mar_M05_0020 20
6 Mar_M06_0020 20
Here I'm filtering again. In this code I didn't expect to get some subdataset because the value 20 is a number and it is'nt correct because it doesnt't exist in the original dataset.
y1 <- filter(data, depth_m == 20) %>%
select(env_sample, depth_m)
head(y1)
Output:
env_sample depth_m
1 Jan_B16_0020 20
2 Jan_B08_0020 20
3 Mar_M03_0020 20
4 Mar_M04_0020 20
5 Mar_M05_0020 20
6 Mar_M06_0020 20
Any comment will be helpful. Thank you.
uj5u.com熱心網友回復:
在 R 中,該運算式20 == "20"是有效的,盡管有些人(來自其他編程語言)可能認為這有點“草率”。當它被評估時,它會升級20to 以"20"進行比較。這種無聲轉換可能很好(有用且靈活),但也可能導致意外、不希望和/或令人驚訝的結果。(它沉默的事實是我不喜歡它的,但方便就是方便。)
如果你想完全清楚你的比較,你也可以測驗類。在您的示例中,您從技術上展示20了哪個是而不是(這將是),但是您可以根據自己的喜好塑造條件的精確度:numericinteger20L
filter(data, is.numeric(depth_m) & depth_m == 20)
這仍然會升級20to "20",但由于第一部分is.numeric(.)失敗,兩者的組合也會失敗。意識到該測驗的特殊性是絕對的:如果列確實是字符,那么您將始終得到零行,這可能不是您想要的。相反,如果您只想在非20行數為 20 和數字時洗掉它們,那么也許
filter(data, !is.numeric(depth_m) | depth_m == 20)
這就是“如果不是數字,那么它顯然不可能是真的20,所以保留它......但如果它是數字,請確保它肯定是20”的令人眼花繚亂的邏輯。當然,我們在這里遇到的前提是,列的一部分不可能是數字,而另一部分不能,所以……也許這過度放縱了過濾的特殊性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/441248.html
標籤:r dataframe dplyr filter tidyverse
上一篇:如何將多個df與公共列并排連接?
下一篇:重復每個專案不同的次數
