我有一个data.table,其中有一些列名称NA.试图将它们更改为角色名称失败,他们留下来NA.
我设法通过切换到data.frame来替换它们,但有没有办法data.table?
dt <- data.table(a = 1:2, b = 2:3)
setDF(dt)
names(dt) <- c(NA,"c")
setDT(dt)
names(dt) <- c("a","b")
names(dt)
# [1] NA "b"`
Run Code Online (Sandbox Code Playgroud)
使用data.frame它的工作原理:
setDF(dt)
names(dt) <- c("a", "b")
names(dt)
# [1] "a" "b"`
Run Code Online (Sandbox Code Playgroud)
编辑:@akrun建议使用NA_character_,但这不适用于名称中的几个NA(这是我的情况,但上面的例子已经简化)
dt <- data.table(a = 1:2, b = 2:3, c = 2:3)
setDF(dt)
names(dt) <- c(NA,NA,"c")
setDT(dt)
setnames(dt, NA_character_, c('a','b'))
Run Code Online (Sandbox Code Playgroud)
错误
setnames(dt, NA_character_, c("a", "b")):old列名中的某些项重复(不明确):NA
setnames(dt, c(NA_character_,NA_character_), c('a','b'))
Run Code Online (Sandbox Code Playgroud)
错误
setnames(dt, c(NA_character_, NA_character_), c("a", "b")):有些重复old …
因此,如果我使用现有向量和setDT的data.frame构建data.table,则在父环境中修改原始向量:
a <- 1:2 / 2
x <- 1:10 / 2
y <- 11/2
dt <- data.frame(a, x, y)
setDT(dt)
dt[ , cond := a == 1]
dt[(cond), c("x", "y") := list(y, x)]
x
#[1] 0.5 5.5 1.5 5.5 2.5 5.5 3.5 5.5 4.5 5.5
Run Code Online (Sandbox Code Playgroud)
对于Info,我使用R 3.5.1和data.table 1.11.4
如果我使用data.table构造函数而不是data.frame + setDT,它不会修改向量x.
a <- 1:2 / 2
x <- 1:10 / 2
y <- 11/2
dt <- data.table(a, x, y)
dt[ , cond := a == 1]
dt[(cond), c("x", "y") := …Run Code Online (Sandbox Code Playgroud)