我有两个对象:
Dataframe 1 :
Address City
xyz City1
xyy City1
xxx City2
... ...
Dataframe 2
Column 1 Column 2 City
.... ... City1
.... ... City2
我想加入两个数据帧,这样我就可以从数据帧1到数据帧2分配一个随机但唯一的地址,因为城市之间存在匹配。
基本上,这个想法是为给定的城市分配一个随机地址。
我不认为联接会在这里起作用,因为数据帧的大小不同,我需要分配一个唯一的地址值。也许我错了。
我有什么想法可以解决这个问题?
答案 0 :(得分:2)
我们的想法是为您的第一个数据集中的每个City
选择一个随机行,然后将该信息加回到您的第二个数据集中。
# example datasets
df1 = read.table(text = "Address City
xyz City1
xyy City1
xxx City2
zzz City2", header=T, stringsAsFactors=F)
df2 = read.table(text = "Column1 Column2 City
1 3 City1
2 4 City2", header=T, stringsAsFactors=F)
library(dplyr)
set.seed(1) # for reproducible results
df1 %>%
group_by(City) %>% # for each city
sample_n(1) %>% # pick a random row
right_join(df2, by="City") %>% # right join df2
ungroup() # forget the grouping
# # A tibble: 2 x 4
# Address City Column1 Column2
# <chr> <chr> <int> <int>
# 1 xyz City1 1 3
# 2 xxx City2 2 4
答案 1 :(得分:0)
data.table
替代方案:
加密整个地址数据一次(sample(.I)
),加入&#39; City&#39;,然后选择第一个匹配项( mult = "first"
)
library(data.table)
setDT(d1)
setDT(d2)
d1[d1[ , sample(.I)]][d2, on = "City", mult = "first"]
# City Address
# 1: c1 a2
# 2: c2 a3
# 3: c3 a1
# 4: c4 a2
d1 <- data.frame(City = rep(paste0("c", 1:4), each = 4),
Address = paste0("a", 1:4))
d2 <- data.frame(City = paste0("c", 1:4))
不知道Speeed是否是一个问题,但是对于更大的数据,这应该更快。