【问题标题】:R - eliminating duplicate valuesR - 消除重复值
【发布时间】:2016-10-19 08:02:58
【问题描述】:

我有一个这样的输入数据框:

我希望输出是这样的:

例如,我想获取第一个值(玛丽有生命),针对所有其他具有重复 COL1 条目的行进行扫描,如果存在重复的 COL2 值,我需要在合并非重复项时单独消除重复项.换句话说,我想做模式搜索。如果同一模式出现在另一行中,我只想消除重复模式并合并非重复模式。

我尝试使用 grepl 和 gsub 函数,但无法正确获得我想要的结果。

在下面插入一个更简单的输入数据集:

COL1 COL2 10 玛丽有生命 10唐玛丽有生命 10布里托玛丽有生命 20 推他们 20 推他们的毛皮 30 对此大喊大叫 30 这是对这个大喊大叫 40年 40 小狗 40匹马

【问题讨论】:

  • 请在添加一些代码(或像这样的数据示例)缩进时使用 4 个空格,这样它变得更具可读性,或者使用 dput(mydf)
  • 我删除了我的答案,因为显然我不明白你希望它的处理方式。
  • 您想在不分隔字符串的情况下获得一组独特的空格分隔模式吗?这真的没有意义......或者我仍然不明白你对解决方案的限制。
  • 我编辑了帖子,以便现在有意义!

标签: r dataframe merge


【解决方案1】:

更新后:

df <- read.table(
  text = "COL1;    COL2
10;  mary has life
10;  Don mary has life
10;  Britto mary has life
20;  push them
20;  push them fur
30;  yell at this
30;  this is yell at this", 
  sep = ";", header = TRUE, 
  strip.white = TRUE, stringsAsFactors = FALSE)
library(dplyr)
res <- df %>%
  group_by(COL1) %>%
  do(COL2 = {
    first_value <- .$COL2[[1]]
    paste(unlist(Reduce(function(a, b) {
      new_values <- strsplit(b, first_value)[[1]]
      c(a, new_values)
    }, .$COL2)), collapse = ", ")
  })
res$COL2 <- unlist(res$COL2)

【讨论】:

  • 这段代码工作得很好......但是应该有一个小的更正......例如,在我上面的输入中,如果我将所有COL2值更改为唯一值,即(Mary,Don,Britto,push,fur,yy,this)......然后对于输出的第一行,我应该得到(Mary,Don,Britto)......对于第二行输出我应该得到(推,毛皮)......对于输出中的第三行,我应该得到(大喊,这个)......简单来说,如果 COL2 值包含唯一的单个单词,您的代码将不起作用在这种情况下,唯一的单词应该合并在一起
  • 我只是删除了if (new_values[1] == b) new_values &lt;- NULL。小心:就像你说的,它just很好,不超过just。这里有很多关于您的输入数据的假设。也许有更简单的方法可以实现您的最终目标,需要更少的脆弱代码。
  • 现在这工作正常......但它不适用于我的原始输入...... @Apom ..我现在已经编辑了我的问题......如果代码适用于此输入,我已经完成了我的艰辛......你能帮忙吗
  • 你想用这个脚本的输出来完成什么?就像我说的,如果你重新考虑你的问题,也许有更简单的方法
  • 对于输入中重复的 COL1 行,我想合并每一行的所有唯一文本模式......应该丢弃重复的条目......你最初提供的代码是完美的......除了如果我在重复行中有所有唯一的 COL2 条目,它就不起作用,我希望所有唯一的条目都合并到输出中
猜你喜欢
  • 2023-03-10
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多