R - 使用循环搜索一个变量与另一个变量并创建新的合并变量
R - Using loops to search one variable with another and create new merged variable
我只擅长 R 编码的基础知识,不知道如何进行复杂的循环。
我有一个大型数据框,其中包含一列地址和一列邮政编码(以及其他变量)。每列中有许多 NA。地址列中某些行的数据不完整,其中缺少邮编和州或仅缺少邮编。我所有的数据都来自同一个州。
我需要清理地址数据以便稍后进行地理编码。我不想省略 NA 行,因为我也将使用相同的数据框进行仅限邮政编码的分析(当我制作太多相似的对象时,我也会迷路)。我在 Address 中有很多 NA,但我仍然有同一行的 Zipcode 值。
我的解决方案是:
- 对于 df$Address 中的每一行,如果它不是 NA
- 如果 df$Address 不以 df$Zipcode 结尾
- 然后将 df$Address 与“MI”和 df$Zipcode 组合粘贴为新列值
- 删除重复的单词(对于地址带有状态但仅缺少 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
我只擅长 R 编码的基础知识,不知道如何进行复杂的循环。 我有一个大型数据框,其中包含一列地址和一列邮政编码(以及其他变量)。每列中有许多 NA。地址列中某些行的数据不完整,其中缺少邮编和州或仅缺少邮编。我所有的数据都来自同一个州。
我需要清理地址数据以便稍后进行地理编码。我不想省略 NA 行,因为我也将使用相同的数据框进行仅限邮政编码的分析(当我制作太多相似的对象时,我也会迷路)。我在 Address 中有很多 NA,但我仍然有同一行的 Zipcode 值。
我的解决方案是:
- 对于 df$Address 中的每一行,如果它不是 NA
- 如果 df$Address 不以 df$Zipcode 结尾
- 然后将 df$Address 与“MI”和 df$Zipcode 组合粘贴为新列值
- 删除重复的单词(对于地址带有状态但仅缺少 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