【问题标题】:Deal with duplicates conditionally to an other column with r使用 r 有条件地处理对另一列的重复项
【发布时间】:2021-12-07 23:51:51
【问题描述】:

我有一个大数据库,我想有条件地处理重复(不删除任何一个)到另一列。 下面是我的输入示例:

 name                              nb_participants
 INSTITUT BILA BILA                    10
 INSTITUT BILA BILA                    4
 INSTITUT BILA BILA                    NA
 INSTITUT NZUNDU                       3
 INSTITUT NZUNDU                       15
...
structure(list(name = c("INSTITUT BILA BILA", "INSTITUT BILA BILA", "INSTITUT BILA BILA","INSTITUT NZUNDU","INSTITUT NZUNDU"), nb_participants = c(10, 4, NA,3,15)), row.names = c("1", "2","3","4","5"), class = "data.frame")

想要的输出如下:

 name                            nb_participants
 INSTITUT BILA BILA 2-1              10
 INSTITUT BILA BILA 2-2               4
 INSTITUT BILA BILA 2-3              NA
 INSTITUT NZUNDU 2-2                  3
 INSTITUT NZUNDU 2-1                 15
...
structure(list(name = c("INSTITUT BILA BILA 2-1", "INSTITUT BILA BILA 2-2", "INSTITUT BILA BILA 2-3","INSTITUT NZUNDU 2-2","INSTITUT NZUNDU 2-1"), nb_participants = c(10, 4, NA,3,15)), row.names = c("1", "2","3","4","5"), class = "data.frame")

我有这个命令

data$name<-ave(as.character(data$name), data$name, FUN=function(x) if (length(x)>1) paste0(x[1], '-', seq_along(x), '') else x[1])

但我不知道如何处理有条件地对另一列进行排名。目前我唯一能做的就是:

data<-data %>% 
  group_by(name) %>% 
  filter(nb_participants ==max(nb_participants))

您有什么想法可以帮上忙吗?非常感谢。

【问题讨论】:

  • 后缀的"2-"是什么意思?
  • 另外请提供输入数据的可重现示例
  • 你尝试了什么?排名数字是否必须添加到第 1 列的字符串中,还是可以是不同的列? (子问题:您确定需要将 NA 值保留在第 2 列中吗? - 如果是这样,它会使排名更加复杂)
  • -2 表示重复。另外,我刚刚添加了一个可复制的示例。对于 NA 值,我想保留尽可能多的信息。但是,如果它使排名变得困难,那么分析就不是必需的,所以我想我可以不这样做。
  • 执行此操作的标准方法是使用 make.unique,但是尽管这样做是为了达到目的,但即使使用自定义 sep,它看起来也不会与您建议的相同。这个函数对你来说够用还是你更愿意创建一个自定义函数?

标签: r duplicates


【解决方案1】:

这可以帮助您解决问题(使用包 tidyverse 作为语法)。 首先,如果您想按 nb_participant 变量降序对数据进行排序,请执行以下操作:

df <- df %>% arrange(name, desc(nb_participants))

然后,您必须按名称创建迭代次数:

df <- df %>% group_by(name) %>% mutate(id = row_number())

id 列将计算每次出现的 name 变量。

如果您想将该数字添加到您在示例中显示的名称变量中,您可以简单地执行以下操作:

df$name <- paste(df$name, " 2- ", df$id, sep="")

【讨论】:

  • 值得注意的是,这也会影响非重复行
  • 也许我可以将重复项和唯一行分成 2 个数据库,然后在重复项数据库上执行此命令,然后使用 rbind (重新)组合唯一项和重复项?
  • 使用以下代码:唯一% group_by(name) %>% filter(n() == 1) 和重复% group_by(name) %> % 过滤器(n() > 1)
  • 是的,这是拆分数据的好方法,也许删除 nb_participants 的 NA 观察结果可能会很有用。但这取决于你想要什么
猜你喜欢
  • 2021-09-09
  • 1970-01-01
  • 2018-10-18
  • 2020-05-22
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
相关资源
最近更新 更多