Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用列名向量在循环中重新编码data.table值_R_Data.table - Fatal编程技术网

R 使用列名向量在循环中重新编码data.table值

R 使用列名向量在循环中重新编码data.table值,r,data.table,R,Data.table,我有一个包含一些分类变量的大型数据表,其中缺少的值被编码为空字符串。我想把它们重新编码为NA 我有一个存储分类变量名称的向量: categorical_variables = c("v3", etc. 向量的设置肯定是正确的——我已经成功地使用它来循环每个列的图。然而,当我尝试使用此重新编码时 for (v in categorical_variables) myDataTable[get(v)=="",get(v):=NA] …我得到以下错误: Error in get(v) : obj

我有一个包含一些分类变量的大型数据表,其中缺少的值被编码为空字符串。我想把它们重新编码为NA

我有一个存储分类变量名称的向量:

categorical_variables = c("v3", etc.
向量的设置肯定是正确的——我已经成功地使用它来循环每个列的图。然而,当我尝试使用此重新编码时

for (v in categorical_variables) myDataTable[get(v)=="",get(v):=NA]
…我得到以下错误:

 Error in get(v) : object 'v3' not found
然而,这是可行的:

myDataTable[v3=="",v3:=NA]
myDataTable[get("v3")=="",get("v3")]
这也行:

myDataTable[v3=="",v3:=NA]
myDataTable[get("v3")=="",get("v3")]
因此,当我尝试使用get()和:=组合来执行赋值时,它会抛出错误。我做错了什么


data.table非常大(因此我倾向于使用data.table),所以理想情况下,我不想转换为data.frame并使用base R方法。我觉得在data.table中这应该是一个非常简单的过程,但我真的很难在文档中、在谷歌上或在这里找到任何结论!这是一个bug还是我遗漏了一些明显的东西?

我们可以使用
set
。根据
?set
,由于避免了
[.data.table
的开销,因此速度非常快

library(data.table)
for (v in categorical_variables){
   set(myDataTable, i=which(myDataTable[[v]]==""), j=v, value=NA)
 }
但是,在读取自身时可以避免这种情况,因为
fread
具有
na.strings
选项(就像
read.csv/read.table
)。我们可以指定需要读取为na的字符,即如果我们有
$
读取为
na

myDataTable <- fread("yourfile.csv", na.strings=c("", "$"))

myDataTable在
read.csv/read.table/fread
中使用
na.strings=“”
将其作为na`akrun的答案来阅读是很好的,但另一个注意事项是:
myDataTable[get(v)==”,get(v):=na]
的问题是您希望在
的左侧有一个列名:=/code>,而
v
是一个列名,
get(v)
是列本身,每行一个值的向量。将
get(v)
替换为
(v)
。还有一件事:最好在你的问题中加入一个例子。akrun必须自己给出答案,因为你没有答案。你好@Frank,请你发布一个例子,因为我认为这不符合你的建议?v是一个字符串(例如“v3”)data.table通常需要在“=”左边加一个不带引号的列名,这就是get()的作用。data.table和ggplot2中的其他情况下,这种get(v)表示法工作得非常好。“data.table通常需要在“=”左边加一个不带引号的列名——不,有很多方法可以处理左侧。“这就是get()的作用”——不,
get
获取列的值。例如:
DT=data.table(v=c(“a”,“b”);DT[,get(“v”,DT):=1:2]
。顺便说一句,如果你的
get(“v”)
在没有
的情况下工作,DT
,这意味着它正在全局环境中查找
v
(可能是因为您在早些时候使用了
attach(DT)
,这是危险的,因为这样的事情可能会发生)。进一步的例子,如果不清楚括号是如何工作的…
mynewvar=“d”;DT[,(mynewvar):=4]
啊,谢谢!您在我加载数据时发现了我的错误。解决我的问题的最实际的方法确实是按照您的建议设置na.strings=“”,但也感谢您为这个问题提供了一个对其他用途有用的一般性答案。