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