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

3
我只熟悉R编程的基础知识,不确定如何处理复杂循环。我有一个大的数据框,其中包括地址和邮编列(以及其他变量)。每个列中都有许多NA。地址列对于某些行存在不完整的数据,其中缺少邮政编码或州或只有邮政编码。我的所有数据都来自同一个州。
我需要清理地址数据以便稍后进行地理编码。我不想省略NA行,因为我还将在仅使用邮政编码分析的相同数据框上使用它(当我创建太多类似对象时也会感到困惑)。在我仍然具有相同行的Zipcode值的情况下,我的Address中有很多NA。
我想到的解决方案是:
  1. 对于df $ Address中的每一行,如果它是NA
  2. 并且如果df $ Address不以df $ Zipcode结尾
  3. 然后将df $ Address与"MI "和df $ Zipcode结合作为新列值
  4. 删除重复单词(对于仅缺少邮政编码但有州的地址条目)
最小可再现示例:
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)
    }}}

我遇到了这个错误:the condition has length > 1 and only the first element will be used。它将未修改的df$Address粘贴到新列df$Address_cln中。
在继续删除重复的"MI"之前,我试图先正确编码前3个部分,所以我的代码不包括它。
稍后我会尝试修复拼写错误的条目,因为在帮助我上面的合并循环方面还需要大力支持。 感谢您的帮助!
3个回答

2
我们可以检查字符串结尾是否有5个数字,如果是,则返回“Address”,否则将“Zipcode”列与pastestr_c)在一起。
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

2
我们可以使用一些带有正则表达式的 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

1
使用基本的R语言,我为您提供了以下解决方案。但请注意,我从您的代码中使用了"paste"函数并设置了sep="MI"参数,因为您地址的第四个元素已经包含了"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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接