首页 > 解决方案 > 如何正确地在 RStudio 中进行子集化?

问题描述

我创建了以下数据框:

age <- c(21,35,829,2)
sex <- c("m","f","m","c")
height <- c(181,173,171,166)
weight <- c(69,58,75,60)
dat <- as.data.frame(cbind(age,sex,height,weight), stringsAsFactors = FALSE)
dat$age <- as.numeric(age)
dat

我现在只想选择 20 岁以上或 80 岁以下的学生行。

为什么这样做:dat[dat$age<20| dat$age>80,] ; subset(dat, age < 20 | age > 80)

但这不会:dat[dat$age>20| dat$age<80,] ; subset(dat, age > 20 | age < 80)

我可以对不小于 80 岁或不大于 20 岁的行进行子集化,但不能对实际处于此区间的行进行子集化。

错误是什么?

提前致谢。

标签: rsubset

解决方案


因为你的条件基本上允许每个可能的年龄。想想看,您的条件是独立的(因为您使用的是|运算符),因此符合您的条件之一的每一行都由您的过滤器选择。现在在您的 data.frame 中定义的每个年龄都高于 20,或者如果不是,它们肯定低于 80。

如果您想选择年龄在 20 到 80 岁之间的每一行,您将更改逻辑运算符。要使这些条件依赖,如下所示:

dat[dat$age>20 & dat$age<80,]
subset(dat, age > 20 & age < 80)

结果如下:

  age sex height weight
1  21   m    181     69
2  35   f    173     58

现在,如果要选择此间隔之外的所有行,则可以使用!运算符否定此逻辑条件,就像 @r2evans 在评论部分中建议的那样。它会是这样的:

dat[!(dat$age > 20 & dat$age < 80),]
subset(dat, !(age > 20 & age < 80))

结果如下:

  age sex height weight
3 829   m    171     75
4   2   c    166     60

推荐阅读