【问题标题】:Select rows based on non-directed combinations of columns根据列的非定向组合选择行
【发布时间】:2017-08-17 22:56:28
【问题描述】:

我正在尝试根据前两列中的值的组合选择数据框第三列中的最大值。

我的问题类似于this one,但我找不到实现我需要的方法。

编辑:更改示例数据以使列名更明显。

这是一些示例数据:

library(tidyr)
set.seed(1234)
df <- data.frame(group1 = letters[1:4], group2 = letters[1:4])
df <- df %>% expand(group1, group2)
df <- subset(df, subset = group1!=group2)
df$score <- runif(n = 12,min = 0,max = 1)
df

    # A tibble: 12 × 3
   group1 group2       score
   <fctr> <fctr>       <dbl>
1       a      b 0.113703411
2       a      c 0.622299405
3       a      d 0.609274733
4       b      a 0.623379442
5       b      c 0.860915384
6       b      d 0.640310605
7       c      a 0.009495756
8       c      b 0.232550506
9       c      d 0.666083758
10      d      a 0.514251141
11      d      b 0.693591292
12      d      c 0.544974836

在此示例中,第 1 行和第 4 行是“重复”。我想选择第 4 行,因为 score 列中的值大于第 1 行中的值。最终,我希望返回一个数据框,其中包含 group1 和 group2 列以及 score 列中的最大值。所以在这个例子中,我希望返回 6 行。

如何在 R 中做到这一点?

【问题讨论】:

  • df %>% group_by(a,b) %>% summarise(score=max(score))
  • @HubertL 在发布问题之前我曾尝试过,但 group_by 按顺序处理这些因素,这意味着示例中的第 1 行和第 4 行仍将被视为不同的组,当我希望它们被考虑时作为同一组。

标签: r max unique combinations


【解决方案1】:

我更喜欢分两步处理这个问题:

library(dplyr)

# Create function for computing group IDs from data frame of groups (per column)
get_group_id <- function(groups) {
  apply(groups, 1, function(row) {
    paste0(sort(row), collapse = "_")
  })
}
group_id <- get_group_id(select(df, -score))

# Perform the computation
df %>%
  mutate(groupId = group_id) %>%
  group_by(groupId) %>%
  slice(which.max(score)) %>%
  ungroup() %>%
  select(-groupId)

【讨论】:

  • 糟糕,实际上这并不能满足我的需要。最后的部分,带有separate 函数,有时将group1 值重新分配给group2,反之亦然。在示例数据上运行代码时,请自行查看。返回的第一行应在group1 中显示b,在group2 中显示a,但您的建议却相反。有什么想法吗?
  • 更新了答案。我不太清楚您是否要保留分组变量的顺序。
  • 抱歉没有说的更清楚。非常感谢您提供更新的答案,这可以解决问题。我一定会研究dplyr 提供的更多功能,因为它在这里非常有用。
猜你喜欢
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多