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

时间:2018-12-26 07:27:30

标签: r data.table

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

dt

   ID  0  1  2  3  4  5  6  7  8  9 t1 t2
1:  b 10 11 12 13 14 15 16 17 18 19  4  8
2:  c 20 21 22 23 24 25 26 27 28 29  2  7
3:  d 30 31 32 33 34 35 36 37 38 39  7  9
4:  a 40 41 42 43 44 45 46 47 48 49  3  6

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

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

  

col <-colnames(dt)for(i in 2:length(col)){set(x = dt,         i = which(dt [[“” t1“]] <= i | i <= dt [[” t2“]]),         j = j,         值= NA)}

但它不起作用

我想要的是这样的表

将值更改为不在t1:t2范围内的NA

   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

有什么方法可以使用date.table设置函数?

因为实际数据很大,所以我想使用data.table

2 个答案:

答案 0 :(得分:1)

base R选项是使用row/col索引

lst <- Map(function(x, y) match(setdiff(col, x:y), names(dt)),  dt$t1, dt$t2)
dt[cbind(rep(seq_along(lst), lengths(lst)), unlist(lst))] <- NA
dt
#  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

数据

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]

答案 1 :(得分:1)

这也是一种sorted list:['A', 'B', 'C', 'D', 'E'] 解决方案:

dplyr

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