R - 使用循环搜索一个变量与另一个变量并创建新的合并变量

R - Using loops to search one variable with another and create new merged variable

我只擅长 R 编码的基础知识,不知道如何进行复杂的循环。 我有一个大型数据框,其中包含一列地址和一列邮政编码(以及其他变量)。每列中有许多 NA。地址列中某些行的数据不完整,其中缺少邮编和州或仅缺少邮编。我所有的数据都来自同一个州。

我需要清理地址数据以便稍后进行地理编码。我不想省略 NA 行,因为我也将使用相同的数据框进行仅限邮政编码的分析(当我制作太多相似的对象时,我也会迷路)。我在 Address 中有很多 NA,但我仍然有同一行的 Zipcode 值。

我的解决方案是:

  1. 对于 df$Address 中的每一行,如果它不是 NA
  2. 如果 df$Address 不以 df$Zipcode 结尾
  3. 然后将 df$Address 与“MI”和 df$Zipcode 组合粘贴为新列值
  4. 删除重复的单词(对于地址带有状态但仅缺少 zip 的条目)

最小可重现样本:

Address <- c("1234 address", "5678 address, MI", "9012 address, MI 12345", "1111 adrus")
Zipcode <- c("67890", "56780", "12345", "12345")
df <- data.frame(Address, Zipcode)

#example dataframe
Address                   Zipcode
1234 address               67890            
5678 address, MI           56780            
9012 address, MI 12345     12345            
1111 adrus                 12345    

这是我的尝试。我也尝试使用 grepl() 并得到了同样的错误。

for (i in 1:length(df$Address)) {
  if(!is.na(df$Address[i])) {
    if (!endsWith(df$Address, df$Zipcode)) {
       df$Address_cln<- paste(df$Address, df$Zipcode, sep="MI ")
    }
    else {dataZip$address_cln <- paste(dataZip$Address)
    }}}

我收到此错误:条件的长度 > 1 且仅使用第一个元素。它将未修改的 df$Address 粘贴到新列 df$Address_cln

在继续删除重复的“MI”之前,我试图正确编码前 3 个部分,这样我的代码中就不会包含这些部分。

我稍后会尝试以某种方式修复拼写错误的条目,因为除了帮助我上面的合并循环外,这是一个很大的问题。 感谢您的帮助!

我们可以检查 'Address' 是否在字符串末尾有 5 个数字,然后 return 'Address' 否则 paste (str_c ) 与 'Zipcode' 列

library(dplyr)
library(stringr)
df %>%
  mutate(Address2 = case_when(str_detect(Address, '\d{5}$') ~
    Address, str_detect(Address, 'MI$') ~ str_c(Address, Zipcode, 
     sep = ' '), TRUE ~ str_c(Address, Zipcode, sep = ', MI ')))

-输出

#                 Address Zipcode               Address2
#1           1234 address   67890  1234 address MI 67890
#2       5678 address, MI   56780 5678 address, MI 56780
#3 9012 address, MI 12345   12345 9012 address, MI 12345
#4             1111 adrus   12345    1111 adrus, MI 12345

使用 Base R,我为您提供了这个解决方案,但请注意,我从您的代码中获取了带有 sep="MI" 的“粘贴”,您地址的第 4 个元素已经有“MI”,所以这会在输出中添加一个双音“MI”,没有任何知识我的猜测是它是一个状态缩写,如果数据涵盖多个状态,则很可能不正确。

Address <- c("1234 address", "5678 address, MI", "9012 address, MI 12345", "1111 adrus")
Zipcode <- c("67890", "56780", "12345", "12345")
df <- data.frame(Address, Zipcode)    

df$address_cln <- apply(df,MARGIN = 1, function(df_row) {
  if(!grepl(paste0(df_row[2],"$"), df_row[1])){
    return(paste(df_row[1], df_row[2], sep=" MI "))
  }else{
    return(df_row[1])
  }
})

df

         Address           Zipcode             address_cln
1           1234 address   67890     1234 address MI 67890
2       5678 address, MI   56780 5678 address, MI MI 56780
3 9012 address, MI 12345   12345    9012 address, MI 12345
4             1111 adrus   12345       1111 adrus MI 12345

我们可以使用一些带有正则表达式的 stringr 函数:

library(stringr)
library(dplyr)
df %>% 
  mutate(Address= str_remove(Address, "[0-9]*$"),
         Address= str_trim(str_remove(Address, ", MI"))) %>% 
  mutate(Address_new = str_c(Address, " MI ", Zipcode))

输出:

       Address Zipcode           Address_new
1 1234 address   67890 1234 address MI 67890
2 5678 address   56780 5678 address MI 56780
3 9012 address   12345 9012 address MI 12345
4   1111 adrus   12345   1111 adrus MI 12345