【问题标题】:how to use R package stringr or stringi to concatenate strings with NAs in data table如何使用 R 包 stringr 或 stringi 将字符串与数据表中的 NA 连接起来
【发布时间】:2015-11-13 14:12:58
【问题描述】:

我有一个包含许多街道地址字段列的数据表,例如NUMSTREET_PRESTREETNAMESTREETTYPEAPT_NOCITYSTATEZIP。许多行并非在所有列中都有值,例如 STREET_PREAPT_NO

我需要从这些列中获取地址字符串。使用 paste0 会将字符串“NA”放入结果中。我搜索并发现一些关于这个问题的讨论只是在之后替换“NA”,或者在连接中使用 if else。如果有一些“NA”的有效输入,之后替换 NA 可能会带来问题。

stringrstr_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

这个输入有一些非标准值,但我仍然希望得到一个地址字符串。我会让地理编码器来确定地址是否有效。

这似乎是一项简单的任务,但很难得到我想要的东西。 pastestr_cstri_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


【解决方案1】:

来自stringi 文档:

如果输入向量中有任何 NA,则将 NA 设置为对应的 元素。请注意,此行为与 paste 不同,后者将 缺失值作为普通字符串“NA”。

先尝试删除NAs:

library(stringi)
stri_c(na.omit(t1), collapse = "")

【讨论】:

  • 是的,我之前尝试过na.omit,na.omit 的直接结果给出了一些数字,我没有尝试将na.omit 放在stri_c 中。这似乎可行,但我认为 stringr 和 stringi 应该能够在没有 na.omit 帮助的情况下处理 NA,因为他们提到了对 NA 的不同处理,并且可以选择 ignore_null。
  • @dracodoc NULLNA 不同。 NULL 表示 R 中的空对象:它是保留字。 NULL 通常由其值未定义的表达式和函数返回。 NA 是一个长度为 1 的逻辑常数,其中包含一个缺失值指示符
  • 在数据表中使用 str_c 或 stri_c 似乎比我想象的要复杂。 DT[, address := str_c(na.omit(c(address columns)), collapse = "")] 产生了意想不到的结果,实际上当我试图查看结果时,我的 R-Studio 失去了响应。
  • 为什么不简单地df$newcol <- apply(df, 1, function(x) stri_c(x[!is.na(x)], collapse = ""))
  • 谢谢,这确实有效。但是我的数据表有很多列,要使用这种方法,我需要先选择我需要处理的列(我的问题中的 t1 是一个过于简化的示例),所以对于我的情况来说并不是很简单。现在我只是用'''替换所有NA,然后使用paste0。使用paste0我可以更好地控制分隔符,我需要其中一些是“”,其中一些是“,”。当然最后我需要删除由空列引起的多余空格。
猜你喜欢
  • 1970-01-01
  • 2020-12-11
  • 2023-03-30
  • 2022-11-13
  • 2023-01-24
  • 2020-07-31
  • 2013-04-13
  • 2011-05-13
  • 1970-01-01
相关资源
最近更新 更多