继续替换重复的行,直到没有剩下的行?

时间:2015-10-20 02:43:55

标签: r dataframe

我有一个数据框(df1)来采样行,例如:

name age
name1 7
name2 31
name3 31
name4 34
name5 100
name6 1
name7 35
name8 27
name9 23
name10 3
name11 21
name12 2
name13 50
name14 86

另一个数据帧(df2),我用第一个数据帧中的随机行填充,例如:

name age
name4 34
name2 31
name11 21
name12 2
name6 1
name14 86

在我的代码中,我从df2中选择几行(示例中为5),用df1中的(5)随机行覆盖。

random_df2 <- sample(1:nrow(df2),5,replace=FALSE)
df2[random_df2] <- df1[sample(1:nrow(df1),5,replace=FALSE)]

但问题是我不想在df2中重复。

如果df2中有重复的行,代码应该从df1继续采样行,直到df2中的所有行都是唯一的。

我正在思考像(伪代码):

while(there are duplicate rows in df2) {
rowNums <- get the row numbers of rows that are not unique
num <- get the number of rows not unique
      df2[rowNums,]<- sample(df1[sample(1:nrow(df1),num,replace=FALSE)]
}

不确定这是否是在r ..

中实现结果的最佳方法

2 个答案:

答案 0 :(得分:1)

您应首先找出df1中未包含在df2中的行。 dplyr的anti_join非常适合这种情况,sample_n函数也是如此。

library(dplyr)

rows_replace <- 1:5
num_replace <- length(rows_replace)

new_rows <- df1 %>%
    anti_join(df2[-rows_replace, ]) %>%
    sample_n(num_replace)

df2[rows_replace, ] <- new_rows

答案 1 :(得分:1)

为什么不从那些尚未在df2中的样本中取样?

也许是这样的:

# Set up example data
df1 <- data.frame(name=paste0('name', 1:20), age=sample(1:100, 20, T))
df2 <- df1[sample(1:nrow(df1), 10), ]

# Get names in df1 that are not in df2
df1_candidates <- setdiff(df1$name, df2$name)

# Sample from the df1 set not in df2 already
df2_replacements <- df1[df1$name %in% sample(df1_candidates, 5), ]

# Replace 5 random rows in df2 with the sampled replacements
random_df2 <- sample(1:nrow(df2), 5)
df2[random_df2, ] <- df2_replacements