[英]Subset a dataframe using a logical vector with $
我無法理解$
符號在 R 中對data.frame
進行子集化時的使用原因和行為。以下示例是在我正在上的初學者課程中介紹的(不是與現場教授一起,所以不能問那里):
temp_mat <- matrix(1:9, nrow=3)
colnames(temp_mat) <- c('a', 'b', 'c')
temp_df <- data.frame(temp_mat)
調用temp_df
顯然輸出:
a b c
1 1 4 7
2 2 5 8
3 3 6 9
課程中給出的例子是:
temp_df[temp_df$c < 10]
哪些輸出:
a b c
1 1 4 7
2 2 5 8
3 3 6 9
使用原因問題:課程說明$
用於部分匹配, x$y
是x[["y", exact=FALSE]]
的精確替代。 為什么我們要在這里使用部分匹配運算符? 我們使用它是因為我們確定在我們的temp_df
中沒有其他類似於“c”的列可能會被錯誤地拾取? 此外,如何測量部分匹配? 匹配字符的最低百分比或其他什么? 如果使用具有未知或相似列名的數據集(例如,家庭電話與手機,這些會被視為有效的部分匹配嗎?),似乎有一個getElement
函數會更合適。
行為問題:似乎上面的示例temp_df[temp_df$c < 10]
是說“從 temp_df 返回元素的子集,其中列 c 小於 10”,並且由於所有列 c 元素都符合條件,因此返回整個數據幀。 我的解釋顯然是錯誤的,因為temp_df[temp_df$c < 9]
返回:
a b
1 1 4
2 2 5
3 3 6
盡管 c 列的第 1 行和第 2 行元素確實滿足小於 9 的標准,但忽略了整列。 我的問題變成了雙重問題:邏輯向量實際上在說什么/做什么? 我將如何編寫我對“從 temp_df 中返回 c 列小於 9 的元素子集”的解釋並讓它返回:
a b c
1 1 4 7
2 2 5 8
因為在我看來,元素 1 和 2(第 1 行和第 2 行)滿足該條件,因為它們的 c 列值小於 9,因此應該返回。
嘗試逐步分解操作。
temp_df$c < 9
給出如下向量:
[1] TRUE TRUE FALSE
當您以您顯示的方式傳遞此向量時: temp_df[c(TRUE, TRUE, FALSE)]
具有對列進行操作的效果。
將data.frame
視為一個列表,列名作為鍵,列內容作為向量值。 該操作保留 TRUE 鍵(即列)並刪除 FALSE。
逗號用於將向量標記為行索引。 保留前兩行,刪除最后一行。 因此, temp_df[c(TRUE, TRUE, FALSE), ]
給出:
a b c
1 1 4 7
2 2 5 8
$
和[[
都是extract
運算符,允許按名稱提取元素。
OP 提出了一個關於exact
參數行為的問題。 [[
運算符的exact
參數已在RStudio
為:
在通過字符向量提取時控制 [[ 的可能部分匹配(對於大多數對象,但請參閱“環境”下)。 默認是沒有部分匹配。 值 NA 允許部分匹配,但在發生時發出警告。 值 FALSE 允許在沒有任何警告的情況下進行部分匹配。
這是什么意思? 要了解其行為,讓我們將 OP 使用的 data.frame 的column names
更改為:
names(temp_df) <- c("aa","bb","cc")
#partial name of column will work with exact = FALSE
temp_df[["a", exact = FALSE]]
#[1] 1 2 3
#partial name of column will not work with exact = TRUE
temp_df[["a", exact = TRUE]]
#NULL
temp_df[["a", exact = NA]]
#[1] 1 2 3
#Warning message:
#In .subset2(x, i, exact = exact) : partial match of 'a' to 'aa'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.