[英]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
。 它具有subset
和select
參數,以傳遞邏輯索引來對行進行子集並分別根據列索引或名稱選擇列。 在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.