簡體   English   中英

R:獲取符合特定條件的列子集

[英]R: obtaining subset of a column that matches a certain criteria

假設我有一個學校所有學生的數據表。 我想看看男性(1)且至少被認為是“高個”的學生的家庭規模。 我將如何在R中執行此操作?

我似乎只能弄清楚如何獲得學生的家庭人數列,該列將是student_data$family_size ,但我不知道如何進一步縮小范圍。

   family_size  ...  gender ... height
1       6              1         very tall
2       3              0         tall
3       5              1         tall
4       4              1         tall
5      10              0         very short
6       2              1         average

所以我想要:

     family_size
1       6
2       5
3       4

我不確定索引的結果如何,也許它對應於第一個表的原始索引,但這並不是那么重要。

另外,我不確定上傳的內容是否為數據框,當我執行typeof(student_data) ,它返回"list"

我們可以使用subset 它具有subsetselect參數,以傳遞邏輯索引來對行進行子集並分別根據列索引或名稱選擇列。 在OP的帖子中,提到要提取性別為“男性”的行,即在二進制列中以1表示。 因此, gender==1通過將1轉換為TRUE,並將其他值(此處為0)轉換為TRUE/FALSE來給出邏輯TRUE/FALSE FALSE。 另一個條件是檢查“ height”列中哪些行具有“ tall”子字符串。 我們使用grepl來匹配“ height”列中的子字符串“ tall”。 我們將兩個條件與&耦合,然后select “ family_size”列。

subset(df1, gender==1 & grepl('tall', height), select= family_size)
#   family_size
#1           6
#3           5
#4           4

或使用[代替subset [是內部功能使用推薦的選項。 但是默認選項是drop=TRUE 因此,如果我們對單個列進行子集設置,則它可能最終以vector 為了避免這種情況,我們可以使用drop=FALSE

df1[with(df1, gender==1 & grepl('tall', height)), 'family_size', drop=FALSE]

數據

df1 <- structure(list(family_size = c(6L, 3L, 5L, 4L, 10L, 2L), 
gender = c(1L, 
0L, 1L, 1L, 0L, 1L), height = c("very tall", "tall", "tall", 
"tall", "very short", "average")), .Names = c("family_size", 
"gender", "height"), class = "data.frame", row.names = c("1", 
 "2", "3", "4", "5", "6"))

您可以通過使用True和False列建立索引來過濾列。 首先,您生成一列True和False

tallStudentsPositions <- (student_data$height == 'tall')

這為您提供了對與錯的列。 如果第N個學生的身高字段為“高”,則第N個條目為True。 (請注意,此測試區分大小寫,並且不在乎您在身高字段中是否有“高”或“很高”。您必須為感興趣的每個條目引入適當的測試。)

然后,您可以訪問被指定為“高大”的所有學生的家庭人數

student_data$family_size[tallStudentsPositions]

您已經介紹了另一個類似的步驟,只過濾掉男學生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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