两个数据帧之间的随机但不重复的采样

时间:2018-03-26 23:13:26

标签: r random sample

我有两个数据帧:

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. 应该为各个城市提取地址。
  3. 所以期望的输出看起来像:

    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"))
    

2 个答案:

答案 0 :(得分:0)

我加载了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" 

答案 1 :(得分:0)

您可以使用

实现此目的
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]
}))

我希望这有帮助!