R:从范围内的数据表中选择值

pou*_*def 32 r

我在R中有一个数据表:

name    date
----    ----
John    1156649280
Adam    1255701960
...etc...
Run Code Online (Sandbox Code Playgroud)

我想得到日期在一个范围内的所有行.在SQL中,我可能会说SELECT * FROM mytable WHERE date > 5 AND date < 15

R中的等价物是什么,根据特定列中的值范围选择行?

And*_*rie 47

构造一些数据

df < - data.frame(name = c("John","Adam"),date = c(3,5))

提取完全匹配:

subset(df, date==3)

  name date
1 John    3
Run Code Online (Sandbox Code Playgroud)

提取范围内的匹配:

subset(df, date>4 & date<6)

  name date
2 Adam    5
Run Code Online (Sandbox Code Playgroud)

以下语法产生相同的结果:

df[df$date>4 & df$date<6, ]

  name date
2 Adam    5
Run Code Online (Sandbox Code Playgroud)


Cha*_*ase 14

这里有很多选择,但最容易遵循的是subset.考虑:

> set.seed(43)
> df <- data.frame(name = sample(letters, 100, TRUE), date = sample(1:500, 100, TRUE))
> 
> subset(df, date > 5 & date < 15)
   name date
11    k   10
67    y   12
86    e    8
Run Code Online (Sandbox Code Playgroud)

您还可以将逻辑直接插入data.frame的索引中.逗号将行与列分隔开.我们只需要记住R首先索引行,然后是列.所以这里我们说的是日期> 5&<15的行,然后是所有列:

df[df$date > 5 & df$date < 15 ,]
Run Code Online (Sandbox Code Playgroud)

我还建议查看子集的帮助页面?subset和逻辑运算符?"&"


ngh*_*ran 5

人们还应该考虑使用filter()from来执行此操作的另一种直观方法dplyr。这里有些例子:

set.seed(123)
df <- data.frame(name = sample(letters, 100, TRUE),
                 date = sample(1:500, 100, TRUE))
library(dplyr)
filter(df, date < 50) # date less than 50
filter(df, date %in% 50:100) # date between 50 and 100
filter(df, date %in% 1:50 & name == "r") # date between 1 and 50 AND name is "r"
filter(df, date %in% 1:50 | name == "r") # date between 1 and 50 OR name is "r"

# You can also use the pipe (%>%) operator
df %>% filter(date %in% 1:50 | name == "r")
Run Code Online (Sandbox Code Playgroud)