我得到一个奇怪的错误,根据其中一列的值拆分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),
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))
我尝试根据列street
的值来分割前两行(我试图找到类似E18 / E20 / E21的模式),我可以执行此操作:
example[1:2, strsplit(street, "/", fixed = T),by = "countrycode,city,streetnr,postalcode"]
一切都很好,它没有拆分行,因为它没有找到&#34; /&#34;。
countrycode city streetnr postalcode V1
1: SE Mariestad NA 54274 E20
2: SE Norrtälje NA 76192 E18
但如果我尝试拆分最后一行:
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
如您所见,它创建了两个具有相同值的新列(V1和V2)(&#34; E18&#34;),而在上一个命令中,它只创建了一个新列(V1)。如果我尝试仅拆分第一行(街道代码为&#34; E20和#34;而不是&#34; E18和#34;),它可以毫无问题地运行:
example[1:1, strsplit(street, "/", fixed = T), by = "countrycode,city,streetnr,postalcode"]
countrycode city streetnr postalcode V1
1: SE Mariestad NA 54274 E20
有人知道为什么会这样吗?可能与字符编纂有关吗?
非常感谢任何帮助。
答案 0 :(得分:4)
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