R 如何基于其他列的值在data.table中创建新列
我有以下data.table格式的数据结构:R 如何基于其他列的值在data.table中创建新列,r,data.table,R,Data.table,我有以下data.table格式的数据结构: ID Cycle Cycle_Day Cycle_Date Positive_Test_Date 1 1 1 3/28/2019 NA 1 1 2 3/29/2019 NA 1 1 3 3/30/2019 NA 1 1 NA NA 3/29/2019 1 2 1 4/2
ID Cycle Cycle_Day Cycle_Date Positive_Test_Date
1 1 1 3/28/2019 NA
1 1 2 3/29/2019 NA
1 1 3 3/30/2019 NA
1 1 NA NA 3/29/2019
1 2 1 4/23/2019 NA
1 2 2 4/24/2019 NA
1 2 3 4/25/2019 NA
1 2 NA NA 4/25/2019
2 1 1 3/18/2019 NA
2 1 2 3/19/2019 NA
2 1 3 3/20/2019 NA
2 1 NA NA 3/18/2019
2 2 1 4/23/2019 NA
2 2 2 4/24/2019 NA
2 2 3 4/25/2019 NA
2 2 NA NA 4/24/2019
我想创建一个新的列“LH_日期”,它将为每个ID和每个周期复制事件周期日期和阳性测试日期匹配中的日期。否则,该值为NA。它应该是这样的:
ID Cycle Cycle_Day Cycle_Date Positive_Test_Date LH_Date
1 1 1 3/28/2019 NA NA
1 1 2 3/29/2019 NA 3/29/2019
1 1 3 3/30/2019 NA NA
1 1 NA NA 3/29/2019 NA
1 2 1 4/23/2019 NA NA
1 2 2 4/24/2019 NA NA
1 2 3 4/25/2019 NA 4/25/2019
1 2 NA NA 4/25/2019 NA
2 1 1 3/18/2019 NA 3/18/2019
2 1 2 3/19/2019 NA NA
2 1 3 3/20/2019 NA NA
2 1 NA NA 3/18/2019 NA
2 2 1 4/23/2019 NA NA
2 2 2 4/24/2019 NA 4/24/2019
2 2 3 4/25/2019 NA NA
2 2 NA NA 4/24/2019 NA
假设您的数据位于名为
DT
的数据表中:
第一个过滤器DT
,其中阳性测试日期不NA
(因为它们对创建新列没有用处)
现在,您可以使用此新列idx
筛选表,并将新列LH\u日期
指定为等于周期日期
。注意如何在i
中使用布尔列,您可以使用Parethes
DT[(idx),左侧日期:=周期日期]
然后,如果您认为不需要,请删除idx
DT[,idx:=NULL]
另一个选项是使用索引查找符合条件的行,并仅更新这些行:
#for each group of ID and Cycle,
#find the row indices where Cycle_Date equals the last Positive_Test_Date
idxDT <- DT[, .I[Cycle_Date==Positive_Test_Date[.N]], .(ID, Cycle)]
#for those row indices, set the LH_Date to be Cycle_Date
#(NA rows or excluded rows defaults to NA by design in data.table)
DT[idxDT$V1, LH_Date := Cycle_Date]
.I
包含data.table中的行索引。从?.I
:
.I是等于seq_len(nrow(x))的整数向量。分组时,它会为组中的每个项目保留其行位置在x中。这对于j中的子集是有用的;e、 g.DT[,.I[which.max(somecol)],by=grp]
输出:
ID Cycle Cycle_Day Cycle_Date Positive_Test_Date LH_Date
1: 1 1 1 3/28/2019 <NA> <NA>
2: 1 1 2 3/29/2019 <NA> 3/29/2019
3: 1 1 3 3/30/2019 <NA> <NA>
4: 1 1 NA <NA> 3/29/2019 <NA>
5: 1 2 1 4/23/2019 <NA> <NA>
6: 1 2 2 4/24/2019 <NA> <NA>
7: 1 2 3 4/25/2019 <NA> 4/25/2019
8: 1 2 NA <NA> 4/25/2019 <NA>
9: 2 1 1 3/18/2019 <NA> 3/18/2019
10: 2 1 2 3/19/2019 <NA> <NA>
11: 2 1 3 3/20/2019 <NA> <NA>
12: 2 1 NA <NA> 3/18/2019 <NA>
13: 2 2 1 4/23/2019 <NA> <NA>
14: 2 2 2 4/24/2019 <NA> 4/24/2019
15: 2 2 3 4/25/2019 <NA> <NA>
16: 2 2 NA <NA> 4/24/2019 <NA>
ID周期周期日周期日期正测试日期左日期
1: 1 1 1 3/28/2019
2: 1 1 2 3/29/2019 3/29/2019
3: 1 1 3 3/30/2019
4:11 NA 2019年3月29日
5: 1 2 1 4/23/2019
6: 1 2 2 4/24/2019
7: 1 2 3 4/25/2019 4/25/2019
8:12 NA 2019年4月25日
9: 2 1 1 3/18/2019 3/18/2019
10: 2 1 2 3/19/2019
11: 2 1 3 3/20/2019
12:21 NA 2019年3月18日
13: 2 2 1 4/23/2019
14: 2 2 2 4/24/2019 4/24/2019
15: 2 2 3 4/25/2019
16:2 NA 4/24/2019
数据:
库(data.table)
格式正确吗?很难说…你能不能加上第一行的dput(dt)输出,比如说20行,这样我们就可以复制你的数据了?对不起,不知道怎么做。如果你能告诉我怎么做,我很乐意。如果你有时间解释一下你的逻辑(或者给我指一下data.table文档中的部分),我将非常感谢你的授课时间。非常感谢。这很有帮助。我已经一步一步地讲了,你对每一步的解释都很有道理。非常感谢。我只熟悉I,j的data.table格式。如果你不介意的话,我有几个问题:1。在这种特殊情况下,双括号格式[[]起什么作用?在DT[DT[,]]中,如果逗号前面的部分指的是i,并且您正在筛选符合条件的行,为什么它是空的?3.我代表什么?四,。什么是V1美元?如果我的问题让人困惑,请随意提供您自己的解释,我会解决的。再次感谢!您好@user12239114,我已经添加了解释。希望现在天气晴朗。嗨,chinsoon12。是的,这很有道理——非常感谢你的解释。我明白了!
ID Cycle V1
1: 1 1 2
2: 1 1 NA
3: 1 2 7
4: 1 2 NA
5: 2 1 9
6: 2 1 NA
7: 2 2 14
8: 2 2 NA
ID Cycle Cycle_Day Cycle_Date Positive_Test_Date LH_Date
1: 1 1 1 3/28/2019 <NA> <NA>
2: 1 1 2 3/29/2019 <NA> 3/29/2019
3: 1 1 3 3/30/2019 <NA> <NA>
4: 1 1 NA <NA> 3/29/2019 <NA>
5: 1 2 1 4/23/2019 <NA> <NA>
6: 1 2 2 4/24/2019 <NA> <NA>
7: 1 2 3 4/25/2019 <NA> 4/25/2019
8: 1 2 NA <NA> 4/25/2019 <NA>
9: 2 1 1 3/18/2019 <NA> 3/18/2019
10: 2 1 2 3/19/2019 <NA> <NA>
11: 2 1 3 3/20/2019 <NA> <NA>
12: 2 1 NA <NA> 3/18/2019 <NA>
13: 2 2 1 4/23/2019 <NA> <NA>
14: 2 2 2 4/24/2019 <NA> 4/24/2019
15: 2 2 3 4/25/2019 <NA> <NA>
16: 2 2 NA <NA> 4/24/2019 <NA>
library(data.table)
DT <- fread("ID Cycle Cycle_Day Cycle_Date Positive_Test_Date
1 1 1 3/28/2019 NA
1 1 2 3/29/2019 NA
1 1 3 3/30/2019 NA
1 1 NA NA 3/29/2019
1 2 1 4/23/2019 NA
1 2 2 4/24/2019 NA
1 2 3 4/25/2019 NA
1 2 NA NA 4/25/2019
2 1 1 3/18/2019 NA
2 1 2 3/19/2019 NA
2 1 3 3/20/2019 NA
2 1 NA NA 3/18/2019
2 2 1 4/23/2019 NA
2 2 2 4/24/2019 NA
2 2 3 4/25/2019 NA
2 2 NA NA 4/24/2019")