无需替换即可合并以仅获取唯一行

时间:2016-10-01 09:17:35

标签: r

我想从y中选择与x中的字符串匹配的n行,其中n = x的长度,但y中的同一行不应多次选择。应从y中随机选择行。

> head(x$Age_Yrs_Sex)
[1] "65_0" "72_1" "82_0" "52_0" "81_0" "58_0"


> head(y,20)
               ID Age_Yrs_Sex
1  10678800017        30_0
2  106788000024        63_0
4  10678800048        59_0
5  1067880000055        68_1
7  1067800079        59_0
8  10678800086        36_1
10 10678000109        39_0
12 1067880123        42_0
13 10678800130        45_1
14 106788000147        49_1
15 1067880000154        24_0
16 106780000161        44_0
17 1067880000178        43_1
19 106780000192        79_0
20 106880000208        22_0
22 107880000222        89_0
23 167880000239        28_0
24 106788000246        44_1
25 106780000253        76_0
26 106780000260        45_1

1 个答案:

答案 0 :(得分:1)

假设x中的条目总是小于y中给定匹配的条目,这应该有效(使用dplyr)。在此处生成可用的示例数据:

y <-
  data.frame(
    ID = 1:1000
    , Age_Yrs_Sex = paste(sample(1:10, 1000, TRUE)
                        , 0:1
                        , sep = "_")
  )

x <-
  data.frame(
    Age_Yrs_Sex = paste(c(1,1:4), 0, sep = "_")
  )

计算每件事的匹配数(如果总是1则可以跳过)

matches <-
  table(x$Age_Yrs_Sex)

将表格过滤为匹配项,然后从每个组中选择上表中找到的匹配项数(使用slice,从1到行数随机抽样行数,返回结果数表中的那场比赛)。

y %>%
  filter(Age_Yrs_Sex %in% names(matches)) %>%
  group_by(Age_Yrs_Sex) %>%
  slice(sample(1:n(), matches[as.character(Age_Yrs_Sex[1])]))

给(例如):

     ID Age_Yrs_Sex
  <int>      <fctr>
1    95         1_0
2   777         1_0
3   151         2_0
4   951         3_0
5   403         4_0