根据列正则表达式

时间:2016-08-30 07:06:02

标签: 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), 
                                   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

有人知道为什么会这样吗?可能与字符编纂有关吗?

非常感谢任何帮助。

1 个答案:

答案 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