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谢谢你的建议。