R 如何转换按位置、按引用索引的数据表列?

R 如何转换按位置、按引用索引的数据表列?,r,data.table,R,Data.table,我有一个data.table,它包含了几列factors。我想将原来读作factors的两列转换为它们的原始数值。以下是我尝试过的: data[, c(4,5):=c(as.numeric(as.character(4)), as.numeric(as.character(5))), with=FALSE] 这给了我以下警告: Warning messages: 1: In `[.data.table`(data, , `:=`(c(4, 5), c(as.numeric(as.chara

我有一个
data.table
,它包含了几列
factor
s。我想将原来读作
factor
s的两列转换为它们的原始数值。以下是我尝试过的:

  data[, c(4,5):=c(as.numeric(as.character(4)), as.numeric(as.character(5))), with=FALSE]
这给了我以下警告:

Warning messages:
1: In `[.data.table`(data, , `:=`(c(4, 5), c(as.numeric(as.character(4)),  :
  Supplied 2 items to be assigned to 7 items of column 'Bentley (R)' (recycled leaving remainder of 1 items).
2: In `[.data.table`(data, , `:=`(c(4, 5), c(as.numeric(as.character(4)),  :
  Supplied 2 items to be assigned to 7 items of column 'Sparks (D)' (recycled leaving remainder of 1 items).
3: In `[.data.table`(data, , `:=`(c(4, 5), c(as.numeric(as.character(4)),  :
  Coerced 'double' RHS to 'integer' to match the factor column's underlying type. Character columns are now recommended (can be in keys), or coerce RHS to integer or character first.
4: In `[.data.table`(data, , `:=`(c(4, 5), c(as.numeric(as.character(4)),  :
  Coerced 'double' RHS to 'integer' to match the factor column's underlying type. Character columns are now recommended (can be in keys), or coerce RHS to integer or character first.
此外,我可以看出转换没有成功,因为第4列和第5列在代码运行后仍然是
factor
s

作为替代,我尝试了以下代码,但根本不会运行:

 data[, ':=' (4=c(as.numeric(as.character(4)), 5 = as.numeric(as.character(5)))), with=FALSE]
最后,我尝试通过
colnames
引用列名:

  data[ , (colnames(data)[4]) := as.numeric(as.character(colnames(data)[4]))]
这会运行,但会导致一行
NA
s以及以下错误:

Warning messages:
1: In eval(expr, envir, enclos) : NAs introduced by coercion
2: In `[.data.table`(data, , `:=`((colnames(data)[4]), as.numeric(as.character(colnames(data)[4])))) :
  Coerced 'double' RHS to 'integer' to match the factor column's underlying type. Character columns are now recommended (can be in keys), or coerce RHS to integer or character first.
3: In `[.data.table`(data, , `:=`((colnames(data)[4]), as.numeric(as.character(colnames(data)[4])))) :
  RHS contains -2147483648 which is outside the levels range ([1,6]) of column 1, NAs generated
我需要按位置而不是按列名执行此操作,因为列名将取决于URL。使用
data.table
按位置转换列的正确方法是什么?

我还有一个相关的查询,即如何相对于其他编号列转换编号列。例如,如果我想将第三列的值设置为45减去第三列的值加上第四列的值,我该如何做?有没有办法区分实数和列数?我知道这样的事情不是办法:

dt[ , .(4) = 45 - .(3) + .(4), with = FALSE]

那么如何才能做到这一点呢?

如果要通过引用和位置进行分配,则需要将要分配的列名作为字符向量,或将列号作为整数向量,并使用
.SDcols
(至少在data.table 1.9.4中)

首先是一个可复制的示例:

library(data.table)
DT <- data.table(iris)
DT[, c("Sepal.Length", "Petal.Length") := list(factor(Sepal.Length), factor(Petal.Length))]
str(DT)
或者:

DT[, c(1,3) := lapply(.SD, function(x) as.numeric(as.character(x))), .SDcols=c(1,3)]
str(DT)

请注意,
:=
要求在左侧有一个列名或位置向量,在右侧有一个列表。

如果要通过引用和位置进行分配,则需要将要分配的列名作为字符向量或列号作为整数向量,并使用
.SDcols
(至少在data.table 1.9.4中)

首先是一个可复制的示例:

library(data.table)
DT <- data.table(iris)
DT[, c("Sepal.Length", "Petal.Length") := list(factor(Sepal.Length), factor(Petal.Length))]
str(DT)
或者:

DT[, c(1,3) := lapply(.SD, function(x) as.numeric(as.character(x))), .SDcols=c(1,3)]
str(DT)

请注意,
:=
要求左侧有一个列名称或位置向量,右侧有一个列表。

按位置索引显然是不好的做法,但请继续:
dt[,4]请不要使用
按位置索引显然是不好的做法,请继续:
dt[,4]请不要使用
@Frank谢谢你的建议。@Frank谢谢你的建议。