Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于列正则表达式拆分行时出错_R_Data.table - Fatal编程技术网

R 基于列正则表达式拆分行时出错

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),

根据其中一列的值拆分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))
一切正常,它不会分割行,因为它找不到“/”

但如果我尝试拆分最后一行:

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
组中各有一个)——它们相互堆叠。在第二种情况下,您有一个长度为两个的列表--它们被放在不同的列中…非常感谢非常感谢