Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何基于其他列的值在data.table中创建新列_R_Data.table - Fatal编程技术网

R 如何基于其他列的值在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

我有以下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/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")