【发布时间】:2016-01-24 12:34:14
【问题描述】:
我有一个包含 3 列的数据表,其中之一 包含不同长度的键:值列表。 我希望重新排列表格,使每一行只有一个键,以值为条件
例如,假设我希望获取值为
input_tbl <-
data.table::data.table(a=c("AA"),b=c("{\"ha:llo\":1,\"wor:ld\":2,\"doog:bye\":3}"),
c=c(1))
那么想要的表应该是
tbl_output <- data.table::data.table(a=c("AA",
"AA"),b=c("ha:llo","wor:ld"), c=c(1,1), s=c(1,2))
我尝试了以下功能:
data_table_clean <- function(dt){
dt[ ,"b" := data.table::tstrsplit(b, ',', fixed = T),by=c(a, c)]
dt[,c('b', 's'):= data.table::tstrsplit(b, ':', fixed=TRUE)]
return(dt[s <=2,])
}
这会产生以下错误
“评估错误(expr,envir,enclos):找不到对象'a'”
当然,欢迎提出任何建议。
键实际上是这样的:
input2_tbl <-
data.table::data.table(a=c("AA"),b=c("{\"99:1d:3u:7y:89:67\":1,\"99:1D:34:YY:T6:Y6\":2,\"ll:5Y:UY:56:R5:R6\":3}"),
c=c(1))
因此输出表应该是:
tbl2_output <- data.table::data.table(a=c("AA",
"AA"),b=c(""99:1d:3u:7y:89:67","99:1D:34:YY:T6:Y6"),
c=c(1,1), s=c(1,2))
谢谢!
更新
data_table_clean <- function(dt){
res <- dt[, data.table::tstrsplit(unlist(strsplit(gsub('[{}"]', '', b),',', fixed=TRUE)), ":(?=[^:]+$)", perl=TRUE),
by = .(a, c)][V2 > -100]
data.table::setnames(res, 3:4, c("b", "s"))
res
}
运行时出现以下错误:
.subset(x, j) 中的错误:无效的下标类型“列表”
【问题讨论】:
-
你在这里打错了。要么使用
c("a", "c"),要么使用"a,c",要么使用.(a, c),要么使用list(a, c),但不能使用它们的组合。此外,您的功能没有做您认为它正在做的事情。我会一步一步走,看看结果如何。 -
你的功能正在为我工作
data_table_clean(input2_tbl) # a c b s #1: AA 1 99:1d:3u:7y:89:67 1 #2: AA 1 99:1D:34:YY:T6:Y6 2 #3: AA 1 ll:5Y:UY:56:R5:R6 3我正在使用data.table_1.9.6 -
你为什么不把
library(data.table)放在顶部,然后去掉所有那些data.table::引用。 -
这不是问题,(我试图避免环境依赖)
标签: r data.table