Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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_Dataframe_Loops_Merge_Na - Fatal编程技术网

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

R-使用循环搜索一个变量和另一个变量,并创建新的合并变量,r,dataframe,loops,merge,na,R,Dataframe,Loops,Merge,Na,我只擅长R编码的基础知识,不知道如何做复杂的循环。 我有一个大数据帧,它有一列地址和一列zipcodes(以及其他变量)。每列中都有许多NA。address列中某些行的数据不完整,其中缺少zip和状态,或者只缺少zip。我所有的数据都来自同一个州 我需要清理地址数据以便稍后进行地理编码。我不想忽略NA行,因为我也将使用相同的数据帧进行zipcode-only分析(当我创建太多类似的对象时,我也会迷失方向)。我在地址中有很多NAs,在这些NAs中,同一行仍然有一个Zipcode值 我的解决方案是:

我只擅长R编码的基础知识,不知道如何做复杂的循环。 我有一个大数据帧,它有一列地址和一列zipcodes(以及其他变量)。每列中都有许多NA。address列中某些行的数据不完整,其中缺少zip和状态,或者只缺少zip。我所有的数据都来自同一个州

我需要清理地址数据以便稍后进行地理编码。我不想忽略NA行,因为我也将使用相同的数据帧进行zipcode-only分析(当我创建太多类似的对象时,我也会迷失方向)。我在地址中有很多NAs,在这些NAs中,同一行仍然有一个Zipcode值

我的解决方案是:

  • 对于df$地址中的每一行,如果不是NA
  • 如果df$Address没有以df$Zipcode结尾
  • 然后将df$Address与“MI”和df$Zipcode组合粘贴为新列值
  • 删除重复字(对于地址为state但仅缺少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    
    
    

    Address我们可以检查“Address”在字符串末尾是否有5位数字,然后返回“Address”,或者用“Zipcode”列粘贴
    stru 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
    

    使用Base R,我为您提供了此解决方案,但请注意,我从您的代码中获取了带有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])
      }
    })
    

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