【发布时间】:2015-11-13 14:12:58
【问题描述】:
我有一个包含许多街道地址字段列的数据表,例如NUM、STREET_PRE、STREETNAME、STREETTYPE、APT_NO、CITY、STATE、ZIP。许多行并非在所有列中都有值,例如 STREET_PRE 或 APT_NO。
我需要从这些列中获取地址字符串。使用 paste0 会将字符串“NA”放入结果中。我搜索并发现一些关于这个问题的讨论只是在之后替换“NA”,或者在连接中使用 if else。如果有一些“NA”的有效输入,之后替换 NA 可能会带来问题。
stringr 的str_c 看起来很有希望,因为它会跳过 NA。但是我总是得到 NA 作为这个输入的结果:
>t1 = c(NA, "Charles County, MD", NA, "Charles County", "MD","00000")
>str_c(t1, collapse = '')
[1] NA
>stri_c(t1,ignore_null = TRUE, collapse = '')
[1] NA
这个输入有一些非标准值,但我仍然希望得到一个地址字符串。我会让地理编码器来确定地址是否有效。
这似乎是一项简单的任务,但很难得到我想要的东西。 paste、str_c、stri_c 似乎都在尝试匹配两个向量并将它们连接起来,但我只想连接一系列字符串。它们都适用于正常情况,但是带有 NA 的输入在不同的功能中会导致不同的问题。
编辑 下面的答案和 cmets 在单行输入上工作,但在数据表中产生了意外的结果。当我只希望它们处理当前行时,它们可能正在处理整个列向量。
我尝试了这些行但没有成功:
address2011_MD_DC[, input_address := paste(na.omit(c(NUM_MILE,STREET_PRE,STREETNAME,STREETTYPE,STREETSUF,APT_NO)),collapse = " ") ]
address2011_MD_DC[, input_address :=
str_c(na.omit(c(NUM_MILE,STREET_PRE,STREETNAME,STREETTYPE,STREETSUF,APT_NO)), collapse = ' ' )]
可能是折叠参数将我想要的列组合成单个值。也许我必须回到我原来使用 paste0 的方法,但先用 '' 替换 NA。
【问题讨论】:
-
你能显示你的数据的实际格式吗? (包括列?)如果是单个向量,
paste(t1[!is.na(t1)],collapse=" ")不会产生预期的结果吗? -
这是一个多行的数据框/数据表,每行多列。是的,这也有效,谢谢!
-
对不起,这不能直接在 data.table 中工作。可能是崩溃导致了意想不到的结果。
标签: r string data.table stringr stringi