【问题标题】:Keep replacing duplicate rows until there are none left?继续替换重复的行,直到没有剩余?
【发布时间】:2015-10-20 02:43:55
【问题描述】:

我有一个数据框 (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.. 中实现结果的最佳方式。

【问题讨论】:

  • 等一下,您是在从 df1 替换 df2 中的行之后从 df2 替换 df1 中的行吗?如果您将 df1 替换为最初取自 df1 的行,您如何期望它保持唯一性?保持唯一性的唯一方法是它只切换 2 个已经存在的行(或保持它们相同)。如果这就是你想要做的,那么有很多更简单的方法。我认为这个问题需要更多关于它试图做什么的细节,听起来这只是一个过程中的一步
  • 对不起,我不想用 df2 替换 df1 中的行。只是在评论中写错了。你的答案看起来很接近我正在寻找的东西,将运行它并看看会发生什么。

标签: r dataframe


【解决方案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

【讨论】:

    【解决方案2】:

    您应该首先找出哪些行包含在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-03
      • 2019-05-11
      • 2019-04-12
      • 2016-12-29
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多