簡體   English   中英

使用帶有 $ 的邏輯向量對數據幀進行子集

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

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