假设我有一张学校所有学生的数据表。我想看看男性(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"
答案 0 :(得分:2)
我们可以使用subset
。它具有subset
和select
参数,用于传递逻辑索引以对行进行子集,并分别根据列索引或名称选择列。在OP的帖子中,提到了提取具有“男性”性别的行,即在二进制列中由1表示。因此,gender==1
通过将1转换为TRUE和其他值(此处为0)为FALSE来给出逻辑TRUE/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"))
答案 1 :(得分:0)
您可以通过使用True和False列对其进行索引来过滤列。首先,您生成一个True和False
列tallStudentsPositions <- (student_data$height == 'tall')
这会给你一列True和False。如果第N个学生在高度场中有“高”,则第N个条目为真。 (请注意,此测试区分大小写,如果您在高度字段中具有“高”或“非常高”,则无需关心。您必须为您感兴趣的每个条目引入适当的测试。)
然后,您可以通过
访问所有被指定为“高”的学生的家庭人数student_data$family_size[tallStudentsPositions]
您已经引入了另一个类似的步骤来过滤掉男性学生。