我需要检查 data.table 中是否存在列:
一些例子:
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).
一种方法:
if (is.null(DT[["d"]])) set(DT, j = "d", value = NA)
注意 NA 默认为 NA_逻辑_。如果这不是您想要的,最好指定一下
class(DT[["d"]])
# [1] "logical"
解决您问题的一个方法:
# 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
我想这应该有用
> 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