R:获得与特定标准匹配的列的子集

时间:2015-10-03 09:16:36

标签: r select

假设我有一张学校所有学生的数据表。我想看看男性(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"

2 个答案:

答案 0 :(得分:2)

我们可以使用subset。它具有subsetselect参数,用于传递逻辑索引以对行进行子集,并分别根据列索引或名称选择列。在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]

您已经引入了另一个类似的步骤来过滤掉男性学生。