我有房屋销售交易的数据框架。目前地址是格式化的。
1 Accacia Avenue,This Town,This City,A10 1AA.
有没有办法可以将其拆分为data.frame中同时删除,
的不同列?
我现在创建了一个单独的向量,只包含地址。
存储在Dataframe的地址列中的地址 - data
。
head(data$Address)
[1] 22 Amesbury Road, Feltham (TW13 5HJ)
[2]Flat 11, Gloucester Court, Links Road, London (W3 0EW)
我需要将其拆分为
"Address1", "Address2", "Address3"
我还需要删除()
中的邮政编码,因为我已在单独的字段中将其删除。
答案 0 :(得分:3)
library(tidyr)
df <- data.frame(address = c("1 Accacia Avenue,This Town,This City,A10 1AA"))
separate(df , address , c("country" , "town" , "city" , "street") , ",")
# country town city street
# 1 Accacia Avenue This Town This City A10 1AA
这些是虚拟列,您可以根据地址更改列名
答案 1 :(得分:3)
您也可以尝试使用splitstackshape
# using df from Nader Hisham's answer
library(splitstackshape)
out = setnames(cSplit(df, "address", ","), c("country", "town", "city", "street"))
#> out
# country town city street
#1: 1 Accacia Avenue This Town This City A10 1AA
答案 2 :(得分:1)
对于您的示例,
a <- c("1 Accacia Avenue,This Town,This City,A10 1AA.")
使用strsplit(),如下所示,
strsplit(a,",")
这会给出一个列表,如果需要,可以将其取消列出(
)[[1]]
[1] "1 Accacia Avenue" "This Town" "This City"
[4] "A10 1AA."
unlist(strsplit(a,","))
[1] "1 Accacia Avenue" "This Town" "This City"
[4] "A10 1AA."
当然,由于你有一个data.frame(),你需要使用lapply或sapply。如果您提供可重复的示例,我们可以向您展示应用函数如何为您提供所需的内容。
答案 3 :(得分:0)
这可能不是满足您需求的最佳方式(由于多种原因),但它应该相当容易理解。这假设您的数据框名为df
,地址字符串位于名为Address
的变量中。
首先确保您的地址存储为字符串:如果class(df$Address)
返回"factor"
而不是"character"
,则可以使用
df$Address <- as.character(df$Address)
分割逗号字符上的地址:
df$splitAdd <- strsplit(df$Address, "\\s*,\\s*")
(注意这假设您要删除的逗号周围可能有空格;如果肯定没有空格,那么您可以用"\\s*,\\s*"
替换","
。)
然后将每个结果字段放入一个新变量,通过向向量的每个元素应用df $ splitAdd一个函数,该函数在适当的索引处提取元素:
df$streetAdd <- unlist(lapply(df$splitAdd, function(x){x[1]}))
df$town <- unlist(lapply(df$splitAdd, function(x){x[2]}))
df$city <- unlist(lapply(df$splitAdd, function(x){x[3]}))
df$code <- unlist(lapply(df$splitAdd, function(x){x[4]}))
(对于你所描述的内容,你实际上可能没有unlist
,但它有时会更方便。)
如果您想从数据框中删除splitAdd
列:
df$splitAdd <- NULL
答案 4 :(得分:0)
您可以使用read.csv(假设此示例中您的数据框称为mydf
,要拆分的变量为address
:
(为了响应您的编辑,您可以在拆分变量之前使用以下内容删除括号及其中的任何内容)
mydf$address <- gsub(' \\(.*?\\)', '', mydf$address)
mydf <- cbind(mydf, read.csv(text=as.character(mydf$address), header = F))