如何检查data.table是否包含列,如果不包含,则创建它并用NA填充它?

问题描述 投票:0回答:3

我需要检查 data.table 中是否存在列:

  • 如果列存在,则保持 data.table 不变;
  • 如果没有,则创建它并用 NA 填充它。

一些例子:

DT = data.table(
  ID = c("b","b","b","a","a","c"),
  a = 1:6,
  b = 7:12,
  c = 13:18
)
DT

尝试过:

DT[, if(exists('d')) 
  DT
  else DT[, 'd' := NA]]

### it creates a 'd' column and fill it with NA:

> DT
   ID a  b  c  d
1:  b 1  7 13 NA
2:  b 2  8 14 NA
3:  b 3  9 15 NA
4:  a 4 10 16 NA
5:  a 5 11 17 NA
6:  c 6 12 18 NA

### but it fill and existing column with NA also:

DT[, if(exists('a')) 
  DT
  else DT[, 'a' := NA]]

> DT
   ID  a  b  c  d
1:  b NA  7 13 NA
2:  b NA  8 14 NA
3:  b NA  9 15 NA
4:  a NA 10 16 NA
5:  a NA 11 17 NA
6:  c NA 12 18 NA

还尝试过:

fifelse(DT %>% pointblank::has_columns(columns = 'd'),
        DT,
        DT[, 'd' := NA])

### but got a length error:

Error in fifelse(DT %>% pointblank::has_columns(columns = "d"), DT, DT[,  : 
  Length of 'yes' is 5 but must be 1 or length of 'test' (1).
r data.table
3个回答
4
投票

一种方法:

if (is.null(DT[["d"]])) set(DT, j = "d", value = NA)

注意 NA 默认为 NA_逻辑_。如果这不是您想要的,最好指定一下

class(DT[["d"]])
# [1] "logical"

2
投票

解决您问题的一个方法:

# way 1
if (!"d" %in% names(DT)) DT[, d := NA]

# way 2
DT[, d := if(exists("d")) d else NA]

       ID     a     b     c      d
   <char> <int> <int> <int> <lgcl>
1:      b     1     7    13     NA
2:      b     2     8    14     NA
3:      b     3     9    15     NA
4:      a     4    10    16     NA
5:      a     5    11    17     NA
6:      c     6    12    18     NA

1
投票

我想这应该有用

> DT[, d := if (!"d" %in% names(.SD)) NA else d][]
       ID     a     b     c      d
   <char> <int> <int> <int> <lgcl>
1:      b     1     7    13     NA
2:      b     2     8    14     NA
3:      b     3     9    15     NA
4:      a     4    10    16     NA
5:      a     5    11    17     NA
6:      c     6    12    18     NA
© www.soinside.com 2019 - 2024. All rights reserved.