【问题标题】:Random but not repeating sampling between two dataframes两个数据帧之间的随机但不重复采样
【发布时间】:2018-03-26 23:13:25
【问题描述】:

我有两个数据框:

DF1:

    UNIQUE_ID   City
k5WjB6MQa5Cru Skopje
k4Yq5QqXwoL4e Skopje
S9jGzT5qMZLyF Skopje
mhSHSuxic58Sf Skopje
MU7eys8NKXQog Skopje
GUBe1scNsXQog Bitola
S9jGzT5qMZLyF Kumanovo

DF2:

  ADDRESS                        City  
 РАТКО МИТРОВИЌ 5 БР.29-ДРАЧЕВО Skopje
 УЛ. МЕТОДИЈА ПАТЧЕВ БР.17А     Skopje
 УЛ ДРАЧЕВСКА 123               Skopje
 УЛ.ДОМАЗЕТОВСКА БР. 24         Skopje
 ДРАЧЕВО УЛ. ЈАНКО МИШИЌ БР. 3  Skopje
 УЛ. ПАРТИЗАНСКИ ПАТ 2 БР. 1    Skopje

我想为 DF1 中的每个唯一 ID 分配一个随机地址。分配应满足两个标准:

  1. 在 DF2 中的所有唯一地址都用完之前,地址不应重复;
  2. 应提取相应城市的地址。

所以想要的输出应该是这样的:

New_DF

    UNIQUE_ID   City   ADRESS
k5WjB6MQa5Cru Skopje   РАТКО МИТРОВИЌ 5 БР.29-ДРАЧЕВО
k4Yq5QqXwoL4e Skopje   УЛ. МЕТОДИЈА ПАТЧЕВ БР.17А
S9jGzT5qMZLyF Skopje   УЛ ДРАЧЕВСКА 123
mhSHSuxic58Sf Skopje   УЛ.ДОМАЗЕТОВСКА БР. 24
MU7eys8NKXQog Skopje   ДРАЧЕВО УЛ. ЈАНКО МИШИЌ БР. 3
GUBe1scNsXQog Bitola   NA
S9jGzT5qMZLyF Kumanovo NA

有什么想法吗?

编辑:

    DF1 (dput)
dput(sk[, c(2, 3)])
structure(list(City = structure(c(12L, 12L, 12L, 12L, 12L), .Label = c("Bitola", 
"Gevgelija", "Gostivar", "Kavadarci", "Kicevo", "Kocani", "Krusevo", 
"Kumanovo", "Negotino", "Ohrid", "Prilep", "Skopje", "Stip", 
"Struga", "Strumica", "Tetovo", "Vinica"), class = "factor"), 
    unique_id = 1:5), .Names = c("City", "unique_id"), class = "data.frame", row.names = c(NA, 
5L))

DF2 (dput)

dput(head(sk2))
structure(list(ADDRESS = c("РАТКО МИТРОВИЌ 5 БР.29-ДРАЧЕВО", 
"УЛ. МЕТОДИЈА ПАТЧЕВ БР.17А", "УЛ ДРАЧЕВСКА 123", "УЛ.ДОМАЗЕТОВСКА БР. 24", 
"ДРАЧЕВО УЛ. ЈАНКО МИШИЌ БР. 3", "УЛ. ПАРТИЗАНСКИ ПАТ 2 БР. 1"
), City = c("Skopje", "Skopje", "Skopje", "Skopje", "Skopje", 
"Skopje")), .Names = c("ADDRESS", "City"), row.names = c(NA, 
-6L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), vars = "City", drop = TRUE, indices = list(
    0:5), group_sizes = 6L, biggest_group_size = 6L, labels = structure(list(
    City = "Skopje"), row.names = c(NA, -1L), class = "data.frame", vars = "City", drop = TRUE, .Names = "City"))

【问题讨论】:

  • 您能dput 提供两个数据帧的样本吗?我只是在将它们放在我的机器上时遇到了一些编码问题,并且想确保在尝试此操作时不会引入另一个问题。
  • @mysteRious 刚刚用 dput 更新了 OP。

标签: r random sample


【解决方案1】:

我加载了您的 DF1 和 DF2,然后创建了一个新的数据框,如下所示:

> library(dplyr)
> matched.df <- DF1 %>% mutate(address=DF2[sample(nrow(DF1)),]$ADDRESS)

新的数据框包含所有正确的列,但是当您尝试显示它时看起来很有趣:

> names(matched.df)
[1] "City"      "unique_id" "address" 

但地址本身看起来不错:

> matched.df$address[1]
[1] "УЛ.ДОМАЗЕТОВСКА БР. 24" 

【讨论】:

  • 可以,但只有在两个城市相同的情况下才有效。否则,它是两个城市之间的混合地址。我需要从 Unique_ID 所在的城市随机抽取一个地址。
  • 例如,如果一个 UNIQUE_ID 有一个城市 - 纽约,那么样本应该从 DF2 中的纽约地址完成。
【解决方案2】:

你可以通过

df1 <- c('k5WjB6MQa5Cru', 'Skopje',
'k4Yq5QqXwoL4e', 'Skopje',
'S9jGzT5qMZLyF', 'Skopje',
'mhSHSuxic58Sf', 'Skopje',
'MU7eys8NKXQog', 'Skopje',
'GUBe1scNsXQog', 'Bitola',
'S9jGzT5qMZLyF', 'Kumanovo')
df1 <- data.frame(matrix(df1, ncol = 2, byrow = TRUE), stringsAsFactors = FALSE)
names(df1) <- c("UNIQUE_ID", "City")


df2 <- c('РАТКО МИТРОВИЌ 5 БР.29-ДРАЧЕВО', 'Skopje',
'УЛ. МЕТОДИЈА ПАТЧЕВ БР.17А', 'Skopje',
'УЛ ДРАЧЕВСКА 123',            'Skopje',
'УЛ.ДОМАЗЕТОВСКА БР. 24'  ,   'Skopje',
'ДРАЧЕВО УЛ. ЈАНКО МИШИЌ БР. 3' , 'Skopje',
'УЛ. ПАРТИЗАНСКИ ПАТ 2 БР. 1'   , 'Skopje')
df2 <- data.frame(matrix(df2, ncol = 2, byrow = TRUE), stringsAsFactors = FALSE)
names(df2) <- c("ADDRESS", "City")



unique.cities <- unique(df1$City)
df1$Address <- unlist(sapply(unique.cities, function(x){
  n.ids <- nrow(df1[df1$City == x, ])
  new.address <- rep(df2[df2$City == x, ]$ADDRESS, ceiling(n.ids/nrow(df2[df2$City == x, ])))
  new.address[1:n.ids]
}))

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多