在两个数据帧之间分配随机但唯一的值

时间:2018-03-26 08:19:34

标签: r join

我有两个对象:

Dataframe 1

Address City
 xyz    City1
 xyy    City1
 xxx    City2
 ...    ...

Dataframe 2

Column 1 Column 2 City
....     ...      City1
....     ...      City2

我想加入两个数据帧,这样我就可以从数据帧1到数据帧2分配一个随机但唯一的地址,因为城市之间存在匹配。

基本上,这个想法是为给定的城市分配一个随机地址。

我不认为联接会在这里起作用,因为数据帧的大小不同,我需要分配一个唯一的地址值。也许我错了。

我有什么想法可以解决这个问题?

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是否是一个问题,但是对于更大的数据,这应该更快。