在R范围内的子集

时间:2018-07-09 15:25:37

标签: r

所以我想基于两个日期对数据集进行子集化。 我有一个变量,它指示化疗的开始日期和第二个用于实验室访问的数据。

我想对我的数据集进行子集,以便仅保留那些在化学启动数据前一年或一年后获取的实验室记录。

我当前正在使用以下代码:

df$lower <- df$ChemoDate - 365 #1 year earlier chemo start date
df$upper <- df$ChemoDate + 365 #1 year after chemo start date 
df <- subset(df, LabDate == (ChemoDate > lower & ChemoDate < upper)) 
#only keep records that have a lab date within a year before or after chemo date

运行此代码后,最终得到0个观察结果。谁能帮忙吗?预先感谢

1 个答案:

答案 0 :(得分:0)

克里斯·利特勒(Chris Littler)的解决方案也有效。我比基本R函数更习惯于tidyverse,所以这里是tidyverse等效项:

library(tidyverse)

new_df <- filter(df, LabDate > lower & LabDate < upper)

使用伪造的数据来确认它符合您的期望:

library(tidyverse)

## make fake data

df <- tibble(
  a = letters[1:10],
  LabDate = sample(500:1500, 10),
  ChemoDate = sample(700:800, 10)
)

df
#> # A tibble: 10 x 3
#>    a     LabDate ChemoDate
#>    <chr>   <int>     <int>
#>  1 a        1419       749
#>  2 b         945       738
#>  3 c         935       735
#>  4 d         956       777
#>  5 e        1299       763
#>  6 f         759       792
#>  7 g        1439       782
#>  8 h         964       779
#>  9 i        1091       785
#> 10 j        1491       736

## apply your code

df$lower <- df$ChemoDate - 365
df$upper <- df$ChemoDate + 365

## suggested solution

new_df <- filter(df, LabDate > lower & LabDate < upper)

new_df
#> # A tibble: 6 x 5
#>   a     LabDate ChemoDate lower upper
#>   <chr>   <int>     <int> <dbl> <dbl>
#> 1 b         945       738   373  1103
#> 2 c         935       735   370  1100
#> 3 d         956       777   412  1142
#> 4 f         759       792   427  1157
#> 5 h         964       779   414  1144
#> 6 i        1091       785   420  1150