R:为数据中的动态命名列动态生成列解析代码 table
R: dynamically generate column-parsing code for dynamically named column in data table
我正在尝试将一些旧代码从数据框实现移动到数据 table。最初我从一个 .csv 文件中获取我的数据,其中一些单元格包含数组,这些数组通过 fread 转换为字符串,如下所示:
> mydata$sport[1]
[1] "[24, 18, 24, 18]"
我想将这些字符串解析为数值数组。这是我第一步的部分工作(去掉括号,第 2 步,此处未显示,是转换为数字数组):
> name = "ascent"
> paste0(name, ":=strsplit(gsub('^\[|\]$','',", name, "),',')")
[1] "ascent:=strsplit(gsub('^\[|\]$','',ascent),',')"
#here I manually copy the result of paste0 into the datatable command
#I want to automate this setup, so this all can be put in a for loop
#for many names
> mydata[, ascent:=strsplit(gsub('^\[|\]$','',ascent),',')]
> mydata$ascent[10]
[[1]]
[1] "-999" " -999"
所以我生成的进行修改的命令很好,但是我有很多 names
我想这样做,所以我不想手动复制和粘贴,因为上面是必要的.我尝试使用此处讨论的 eval
技巧 dynamic column names in data.table, R
但是一旦我引入 eval
代码就不起作用了:
> name = "ascent"
> mydata[, eval(paste0(name, ":=strsplit(gsub('^\[|\]$','',", name, "),',')"))]
[1] "ascent:=strsplit(gsub('^\[|\]$','',ascent),',')"
那么我怎样才能实现它以适用于任意名称,而不必通过 paste0 为每个所需的名称手动创建命令? 我有一个完整的向量 names
我想做这个修改的地方。
这是 table 在 fread
之后和进行任何修改之前的数据:
> mydata[1:10, .(sport, ascent)]
sport ascent
1: [24, 18, 24, 18] [-999, 140.0, -999, 140.0]
2: [2, 2, 2, 22] [-999, -999, -999, -999]
3: [-999, -999, -999, -999] [-999, -999, -999, -999]
4: [-999, -999] [173.0, 173.0]
5: [18, 18] [-999, -999]
6: [-999] [-999]
7: [-999] [-999]
8: [-999] [-999]
9: [-999, -999] [-999, -999]
10: [-999, -999] [-999, -999]
完全不要使用这些名称...
for(j in which(names(mydata) %in% names)) set(mydata,i=NULL,j=j,value=strsplit(gsub('^\[|\]$','',mydata[[j]]),','))
顺便说一句 eval
需要 parse
才能按照您尝试使用它的方式工作,例如 eval(parse(text=paste0(name,":=1+1")))
我正在尝试将一些旧代码从数据框实现移动到数据 table。最初我从一个 .csv 文件中获取我的数据,其中一些单元格包含数组,这些数组通过 fread 转换为字符串,如下所示:
> mydata$sport[1]
[1] "[24, 18, 24, 18]"
我想将这些字符串解析为数值数组。这是我第一步的部分工作(去掉括号,第 2 步,此处未显示,是转换为数字数组):
> name = "ascent"
> paste0(name, ":=strsplit(gsub('^\[|\]$','',", name, "),',')")
[1] "ascent:=strsplit(gsub('^\[|\]$','',ascent),',')"
#here I manually copy the result of paste0 into the datatable command
#I want to automate this setup, so this all can be put in a for loop
#for many names
> mydata[, ascent:=strsplit(gsub('^\[|\]$','',ascent),',')]
> mydata$ascent[10]
[[1]]
[1] "-999" " -999"
所以我生成的进行修改的命令很好,但是我有很多 names
我想这样做,所以我不想手动复制和粘贴,因为上面是必要的.我尝试使用此处讨论的 eval
技巧 dynamic column names in data.table, R
但是一旦我引入 eval
代码就不起作用了:
> name = "ascent"
> mydata[, eval(paste0(name, ":=strsplit(gsub('^\[|\]$','',", name, "),',')"))]
[1] "ascent:=strsplit(gsub('^\[|\]$','',ascent),',')"
那么我怎样才能实现它以适用于任意名称,而不必通过 paste0 为每个所需的名称手动创建命令? 我有一个完整的向量 names
我想做这个修改的地方。
这是 table 在 fread
之后和进行任何修改之前的数据:
> mydata[1:10, .(sport, ascent)]
sport ascent
1: [24, 18, 24, 18] [-999, 140.0, -999, 140.0]
2: [2, 2, 2, 22] [-999, -999, -999, -999]
3: [-999, -999, -999, -999] [-999, -999, -999, -999]
4: [-999, -999] [173.0, 173.0]
5: [18, 18] [-999, -999]
6: [-999] [-999]
7: [-999] [-999]
8: [-999] [-999]
9: [-999, -999] [-999, -999]
10: [-999, -999] [-999, -999]
完全不要使用这些名称...
for(j in which(names(mydata) %in% names)) set(mydata,i=NULL,j=j,value=strsplit(gsub('^\[|\]$','',mydata[[j]]),','))
顺便说一句 eval
需要 parse
才能按照您尝试使用它的方式工作,例如 eval(parse(text=paste0(name,":=1+1")))