R 基于列正则表达式拆分行时出错
根据其中一列的值拆分data.table的行时出现了一个奇怪的错误。如果我创建以下data.table:R 基于列正则表达式拆分行时出错,r,data.table,R,Data.table,根据其中一列的值拆分data.table的行时出现了一个奇怪的错误。如果我创建以下data.table: example <- data.table(dt=c("2016-08-18 16:04:37.0", "2016-08-11 18:01:44.0", "2016-08-11 18:01:44.0"), latitude = c(58.64347, 59.73744, 59.73744),
example <- data.table(dt=c("2016-08-18 16:04:37.0", "2016-08-11 18:01:44.0", "2016-08-11 18:01:44.0"),
latitude = c(58.64347, 59.73744, 59.73744),
countrycode = c("SE", "SE", "SE"),
city = c("Mariestad", "Norrtälje", "Norrtälje"),
street = c("E20", "E18", "E18"),
streetnr = c(NA, NA, NA),
postalcode = c(54274, 76192, 76192))
一切正常,它不会分割行,因为它找不到“/”
但如果我尝试拆分最后一行:
example[2:3, strsplit(street, "/", fixed = T), by = "countrycode,city,streetnr,postalcode"]
我明白了:
countrycode city streetnr postalcode V1 V2
1: SE Norrtälje NA 76192 E18 E18
如您所见,它创建了两个具有相同值(“E18”)的新列(V1和V2),而在前面的命令中,它只创建了一个新列(V1)。如果我尝试仅拆分第一行(街道代码为“E20”而不是“E18”),它将不会出现任何问题:
example[1:1, strsplit(street, "/", fixed = T), by = "countrycode,city,streetnr,postalcode"]
countrycode city streetnr postalcode V1
1: SE Mariestad NA 54274 E20
有人知道为什么会这样吗?可能与字符编码或类似的东西有关
非常感谢您的帮助。
strsplit
返回一个长度等于输入向量的列表。当DT[,j,by]
在j
中看到一个列表时,它将其解释为列列表。如果希望所有内容都在一列中,可以取消列出:
example[,
.(ssplit = unlist(strsplit(street, "/", fixed = TRUE)))
, by = "countrycode,city,streetnr,postalcode"]
在这里执行by=
非常低效,需要枚举所有列名称。可能更好:
s = strsplit(example$street, "/", fixed=TRUE)
example[rep(1:.N, lengths(s)), c(.SD, .(ssplit = unlist(s)))]
dt latitude countrycode city street streetnr postalcode ssplit
1: 2016-08-18 16:04:37.0 58.64347 SE Mariestad E20 NA 54274 E20
2: 2016-08-11 18:01:44.0 59.73744 SE Norrtälje E18 NA 76192 E18
3: 2016-08-11 18:01:44.0 59.73744 SE Norrtälje E18 NA 76192 E18
strsplit
返回长度等于输入向量的列表。当DT[,j,by]
在j
中看到一个列表时,它将其解释为列列表。如果希望所有内容都在一列中,可以取消列出:
example[,
.(ssplit = unlist(strsplit(street, "/", fixed = TRUE)))
, by = "countrycode,city,streetnr,postalcode"]
在这里执行by=
非常低效,需要枚举所有列名称。可能更好:
s = strsplit(example$street, "/", fixed=TRUE)
example[rep(1:.N, lengths(s)), c(.SD, .(ssplit = unlist(s)))]
dt latitude countrycode city street streetnr postalcode ssplit
1: 2016-08-18 16:04:37.0 58.64347 SE Mariestad E20 NA 54274 E20
2: 2016-08-11 18:01:44.0 59.73744 SE Norrtälje E18 NA 76192 E18
3: 2016-08-11 18:01:44.0 59.73744 SE Norrtälje E18 NA 76192 E18
我不太清楚你想在这里看到什么
strsplit
返回一个长度等于给定向量中元素数的列表。在1:2的情况下,您有两个长度为1的列表(每个by
组中各有一个)——它们相互堆叠。在第二种情况下,您有一个长度为两个的列表——它们被放在不同的列中……我不太清楚您希望在这里看到什么strsplit
返回一个长度等于给定向量中元素数的列表。在1:2的情况下,您有两个长度为1的列表(每个by
组中各有一个)——它们相互堆叠。在第二种情况下,您有一个长度为两个的列表--它们被放在不同的列中…非常感谢非常感谢