在r data.table中使用行范围条件使值为NA

在r data.table中使用行范围条件使值为NA,r,data.table,R,Data.table,我尝试用参考值t1,t2将值更改为NA 我尝试在data.table中使用set函数 colAbase R选项将使用row/col索引 ID 0 1 2 3 4 5 6 7 8 9 t1 t2 1: b NA NA NA NA 14 15 16 17 18 NA 4 8 2: c NA NA 22 23 24 25 26 27 NA NA 2 7 3: d NA NA NA NA NA NA NA 37 38 39 7 9 4: a NA NA NA

我尝试用参考值t1,t2将值更改为NA

我尝试在data.table中使用set函数


colA
base R
选项将使用
row/col
索引

   ID  0  1  2  3  4  5  6  7  8  9 t1 t2
1:  b NA NA NA NA 14 15 16 17 18 NA  4  8
2:  c NA NA 22 23 24 25 26 27 NA NA  2  7
3:  d NA NA NA NA NA NA NA 37 38 39  7  9
4:  a NA NA NA 43 44 45 46 NA NA NA  3  6

lstA
base R
选项将使用
row/col
索引

   ID  0  1  2  3  4  5  6  7  8  9 t1 t2
1:  b NA NA NA NA 14 15 16 17 18 NA  4  8
2:  c NA NA 22 23 24 25 26 27 NA NA  2  7
3:  d NA NA NA NA NA NA NA 37 38 39  7  9
4:  a NA NA NA 43 44 45 46 NA NA NA  3  6

lst这里还有一个
dplyr
解决方案:

dt <- structure(list(ID = c("b", "c", "d", "a"), `0` = c(10L, 20L, 
30L, 40L), `1` = c(11L, 21L, 31L, 41L), `2` = c(12L, 22L, 32L, 
42L), `3` = c(13L, 23L, 33L, 43L), `4` = c(14L, 24L, 34L, 44L
 ), `5` = c(15L, 25L, 35L, 45L), `6` = c(16L, 26L, 36L, 46L), 
`7` = c(17L, 27L, 37L, 47L), `8` = c(18L, 28L, 38L, 48L), 
`9` = c(19L, 29L, 39L, 49L), t1 = c(4L, 2L, 7L, 3L), t2 = c(8L, 
7L, 9L, 6L)), class = "data.frame", row.names = c(NA, -4L
   ))

col <- names(dt)[2:11]
df%>%
分组依据(ID)%>%
在(2:11,funs)处突变(如果其他(在%t1:t2,NA中的substr(,nchar(.),nchar(.))%)
ID X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 t1 t2
1 b NA NA NA 14 15 16 17 18 NA 4 8
2 c NA 22 23 24 25 26 27 NA 2 7
3 d NA NA NA NA NA NA 37 38 39 7 9
4 a NA NA 43 44 45 46 NA NA 3 6

它通过“ID”进行分组,然后比较第2:11列的最后一个数字是否在第“t1”列和第“t2”列的范围内。

这里还有一个
dplyr
解决方案:

dt <- structure(list(ID = c("b", "c", "d", "a"), `0` = c(10L, 20L, 
30L, 40L), `1` = c(11L, 21L, 31L, 41L), `2` = c(12L, 22L, 32L, 
42L), `3` = c(13L, 23L, 33L, 43L), `4` = c(14L, 24L, 34L, 44L
 ), `5` = c(15L, 25L, 35L, 45L), `6` = c(16L, 26L, 36L, 46L), 
`7` = c(17L, 27L, 37L, 47L), `8` = c(18L, 28L, 38L, 48L), 
`9` = c(19L, 29L, 39L, 49L), t1 = c(4L, 2L, 7L, 3L), t2 = c(8L, 
7L, 9L, 6L)), class = "data.frame", row.names = c(NA, -4L
   ))

col <- names(dt)[2:11]
df%>%
分组依据(ID)%>%
在(2:11,funs)处突变(如果其他(在%t1:t2,NA中的substr(,nchar(.),nchar(.))%)
ID X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 t1 t2
1 b NA NA NA 14 15 16 17 18 NA 4 8
2 c NA 22 23 24 25 26 27 NA 2 7
3 d NA NA NA NA NA NA 37 38 39 7 9
4 a NA NA 43 44 45 46 NA NA 3 6

它按“ID”进行分组,然后比较第2:11列的最后一个数字是否在“t1”和“t2”列的范围内。

你是说
for
循环不起作用吗?@akrun它不起作用吗?你是说
for
循环不起作用吗?@akrun它不起作用吗它似乎起作用,但它也使t1起作用,t2值NA是否有任何方法可以使用date.table set函数?因为实际数据非常大,所以我想使用数据。table@zellkim我使用了
col,它似乎可以工作,但它也使t1,t2值为NA。有没有办法使用date.table set函数?因为实际数据非常大,所以我想使用数据。table@zellkim我用了
col
dt <- structure(list(ID = c("b", "c", "d", "a"), `0` = c(10L, 20L, 
30L, 40L), `1` = c(11L, 21L, 31L, 41L), `2` = c(12L, 22L, 32L, 
42L), `3` = c(13L, 23L, 33L, 43L), `4` = c(14L, 24L, 34L, 44L
 ), `5` = c(15L, 25L, 35L, 45L), `6` = c(16L, 26L, 36L, 46L), 
`7` = c(17L, 27L, 37L, 47L), `8` = c(18L, 28L, 38L, 48L), 
`9` = c(19L, 29L, 39L, 49L), t1 = c(4L, 2L, 7L, 3L), t2 = c(8L, 
7L, 9L, 6L)), class = "data.frame", row.names = c(NA, -4L
   ))

col <- names(dt)[2:11]
df %>%
 group_by(ID) %>%
 mutate_at(2:11, funs(ifelse(substr(., nchar(.), nchar(.)) %in% t1:t2, ., NA)))

  ID    X0    X1       X2    X3    X4    X5    X6    X7    X8    X9    t1    t2
  <fct> <lgl> <lgl> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
1 b     NA    NA       NA    NA    14    15    16    17    18    NA     4     8
2 c     NA    NA       22    23    24    25    26    27    NA    NA     2     7
3 d     NA    NA       NA    NA    NA    NA    NA    37    38    39     7     9
4 a     NA    NA       NA    43    44    45    46    NA    NA    NA     3     6