【问题标题】:make values NA with row range condition in r data.table在 r data.table 中使用行范围条件生成值 NA
【发布时间】:2018-12-26 16:30:52
【问题描述】:
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

但它不起作用

我想要的是这样的桌子

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

   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

【问题讨论】:

  • 您是说for 循环不起作用?
  • @akrun 不工作

标签: r data.table


【解决方案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]

【讨论】:

  • 它似乎工作但它也使 t1, t2 值不适用有没有办法使用 date.table 设置功能?因为实际数据很大所以我想使用 data.table
  • @zellkim 我用过col &lt;- names(dt)[2:11]
【解决方案2】:

这里也是dplyr的一种解决方案:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 2017-04-30
    • 1970-01-01
    • 2014-03-28
    • 2018-10-10
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    相关资源
    最近更新 更多