小编HNS*_*SKD的帖子

如何根据R中行之间的日期差异过滤行?

在每个内部id,我想保留至少相隔91天的行.在我的数据框中df,id=1有5行,id=2有1行.

因为id=1,我想只保留第1行,第3行和第5行.

这是因为如果我们比较第一个日期和第二个日期,它们相差32天.所以,删除第二个日期.我们继续比较第1和第3个日期,它们相差152天.所以,我们保持第3次约会.

现在,我们使用第3个日期,而不是使用第1个日期作为参考.第3个日期和第4个日期相差61天.所以,删除第4个日期.我们继续比较第3个日期和第5个日期,它们相差121天.所以,我们保持第5个约会.

最后,我们保留的日期是第1天,第3天和第5天.至于id=2,只有一行,所以我们保持这一点.期望的结果显示在dfnew.

df <- read.table(header = TRUE, text = "
id  var1  date        
 1  A     2006-01-01 
 1  B     2006-02-02 
 1  C     2006-06-02 
 1  D     2006-08-02 
 1  E     2007-12-01 
 2  F     2007-04-20 
",stringsAsFactors=FALSE)

dfnew <- read.table(header = TRUE, text = "
id  var1  date        
 1  A     2006-01-01 
 1  C     2006-06-02 
 1  E     2007-12-01 
 2  F     2007-04-20 
",stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

我只能想到用分组开始的df通过id如下:

library(dplyr)
dfnew …
Run Code Online (Sandbox Code Playgroud)

r dplyr

10
推荐指数
2
解决办法
1077
查看次数

我们如何检查唯一 ID 的任何 2 个间隔是否重叠?

我有口服DM药物的患者处方数据,即DPP4和SU,想知道患者是否同时服用了药物(即同一患者中DPP4和SU的间隔是否重叠ID)。

样本数据:

  ID DRUG      START        END
1  1 DPP4 2020-01-01 2020-01-20
2  1 DPP4 2020-03-01 2020-04-01
3  1   SU 2020-03-15 2020-04-30
4  2   SU 2020-10-01 2020-10-31
5  2 DPP4 2020-12-01 2020-12-31
Run Code Online (Sandbox Code Playgroud)

在上面的样本数据中,

  1. ID == 1,患者从有DPP-4和SU同时2020-03-152020-04-01
  2. ID == 2,患者以不同的时间间隔服用了两种药物。

我想将数据分成 2 个,一个用于 DPP4,另一个用于 SU。然后,进行完全连接,并将每个 DPP4 间隔与每个 SU 间隔进行比较。这对于小数据可能没问题,但如果患者有 5 行 DPP4 和另外 5 行 SU,我们将有 25 次比较,这可能效率不高。加上 10000 多名患者。

我不知道该怎么做。

新数据:

希望有一个看起来像这样的新 df。或者任何整洁的东西。

  ID    DRUG      START        END
1  1 DPP4-SU 2020-03-15 2020-04-01 …
Run Code Online (Sandbox Code Playgroud)

performance r data-manipulation dplyr tidyr

8
推荐指数
3
解决办法
123
查看次数

R:如何在 lapply() 中应用 grep()

我想在 R 中应用 grep(),但我不太擅长 lapply()。我知道 lapply 能够获取一个列表,将函数应用于每个成员并输出一个列表。例如,假设x一个列表由 2 个成员组成。

> x<-strsplit(docs$Text," ")
> 
> x
[[1]]
 [1] "I"         "lovehttp"  "my"        "mum."      "I"         "love"     
 [7] "my"        "dad."      "I"         "love"      "my"        "brothers."

[[2]]
 [1] "I"         "live"      "in"        "Eastcoast" "now."      "Job.I"    
 [7] "used"      "to"        "live"      "in"        "WestCoast."  
Run Code Online (Sandbox Code Playgroud)

我想应用 grep() 函数来删除由 http 组成的单词。所以,我会申请:

> lapply(x,grep(pattern="http",invert=TRUE, value=TRUE))
Run Code Online (Sandbox Code Playgroud)

但它不起作用,它说

Error in grep(pattern = "http", invert = TRUE, value = TRUE) : 
argument "x" is missing, with no default
Run Code Online (Sandbox Code Playgroud)

所以,我试过了

> lapply(x,grep(pattern="http",invert=TRUE, value=TRUE,x))
Run Code Online (Sandbox Code Playgroud)

但它说

Error …
Run Code Online (Sandbox Code Playgroud)

r lapply sapply tapply

5
推荐指数
1
解决办法
1万
查看次数

如何使用 dplyr 估算 R 中的缺失变量?

我想为给定现有值的变量估算缺失值。在 中var2,我们注意到有很多NAs。

  1. 如果任何 2 个 id 相同,则它们的值var2相同。
  2. 如果 id 没有 值var2,就像 id==2 的情况一样,那么我们只输出为NA

它应该从df_olddf_new.

 df_old<- read.table(header = TRUE, text = "
 id  var1  var2 
  1  A       12    
  1  B       NA    
  1  E       NA    
  2  G       NA
  2  J       NA
 ")

df_new<- read.table(header = TRUE, text = "
id  var1  var2 
 1  A       12    
 1  B       12    
 1  E       12    
 2  G       NA
 2  J       NA
")
Run Code Online (Sandbox Code Playgroud)

我试过: …

r data-manipulation dplyr

5
推荐指数
1
解决办法
4068
查看次数

使用具有lubridate函数的mutate计算年龄

我想根据出生日期计算年龄.

如果我使用lubridate,我会按照R给定出生日期和任意日期的有效和准确的年龄计算(年,月或周)运行以下内容

as.period(new_interval(start = birthdate, end = givendate))$year

但是,当我尝试使用mutatein dplyr来创建新变量时,我遇到了一个错误.

library(dplyr); library(lubridate)

birthdate <- ymd(c(NA, "1978-12-31", "1979-01-01", "1962-12-30"))
givendate <- ymd(c(NA, "2015-12-31", "2015-12-31", NA))

df <- data.frame(
    birthdate = birthdate,
    givendate = givendate)
Run Code Online (Sandbox Code Playgroud)

以下工作虽然它给出了所有日期和时间值.即年,月,日,小时,分钟和秒.

df<-df %>% mutate(age=as.period(interval(start = birthdate, end = givendate)))

# df
#    birthdate  givendate                  age
# 1       <NA>       <NA>                 <NA>
# 2 1978-12-31 2015-12-31   37y 0m 0d 0H 0M 0S
# 3 1979-01-01 2015-12-31 36y 11m 30d 0H 0M 0S
# 4 …
Run Code Online (Sandbox Code Playgroud)

r lubridate dplyr

4
推荐指数
2
解决办法
2008
查看次数

组合列,同时忽略重复和NA

我有一个数据帧如下,我想结合两列,即Var1Var2.我希望组合列(Var3)不包含重复项<alpha><digit>.也就是说,如果Var1 == A1Var2 == A1,因此Var3 == A1而不是Var3 == A1-A1或者Var1 == A4-E9Var2 == A4,因此,Var3 == A4-E9但不Var3 == A4-E9-A4

df <- read.table(header = TRUE, text = 
"id  Var1    Var2
A   A1       A1
B   F2       A2
C   NA       A3
D   A4-E9    A4
E   E5       A5
F   NA       NA
G   B2-R4    A3-B2
H   B3-B4    E1-G5", stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

以下是我的代码.我想改进它的可读性以及摆脱NA第3行的条目 …

r dataframe dplyr tidyr

4
推荐指数
1
解决办法
154
查看次数

使用带有日期的mutate可以得到数值

我使用lubridatedplyr包来处理日期变量并分别创建一个新的日期变量.

library(lubridate)
library(dplyr)
Run Code Online (Sandbox Code Playgroud)

df我的数据帧.我有两个变量date1date2.我想创建一个新变量date,使其取值date1.如果date1缺少,date2则取代值.

df <- data.frame(date1 = c("24/01/2016",NA,"22/07/2016"),
                 date2 = c("31/01/2016","09/02/2017",NA),
                 stringsAsFactors=FALSE)`
Run Code Online (Sandbox Code Playgroud)

上面的命令给出:

       date1      date2
1 24/01/2016 31/01/2016
2       <NA> 09/02/2017
3 22/07/2016       <NA>
Run Code Online (Sandbox Code Playgroud)

我尝试了以下,我认为可以给我所需的结果.但是,新date变量在数字中.

df %>% 
   mutate_at(vars(date1,date2),dmy) %>% 
   mutate(date=ifelse(is.na(date1),date2,date1))

       date1      date2  date
1 2016-01-24 2016-01-31 16824
2       <NA> 2017-02-09 17206
3 2016-07-22       <NA> 17004
Run Code Online (Sandbox Code Playgroud)

我想要:

       date1      date2       date
1 2016-01-24 2016-01-31 2016-01-24
2       <NA> 2017-02-09 2017-02-09
3 2016-07-22 …
Run Code Online (Sandbox Code Playgroud)

r date lubridate dplyr

2
推荐指数
1
解决办法
3829
查看次数