【问题标题】:R: collapse rows and change value according to condition in data frameR:折叠行并根据数据框中的条件更改值
【发布时间】:2020-07-08 15:32:14
【问题描述】:

我有一个数据集:

structure(list(num = c(12L, 12L), code = structure(1:2, .Label = c("a", "b"), class = "factor"), ranking = c(2414.5, 2414.5), bottom = c(-0.0153795976572657, -0.00651997615327495), previous = c(0.00121016455715892, -0.000166609624290187), of_all_previous = c(-0.000570973882726524, -0.000771377162183913)), row.names = c(NA, -2L), class = "data.frame")

我想根据numranking 折叠两行,因为它们是相同的,但根据两行的列bottompreviousof_all_previous 应按顺序进行比较(意思是:如果它们相等,则转到下一列,如 bottom -> previous -> of_all_previous)并选择具有较高值的​​ code

对于提供的示例数据,codeb 因为-0.0065199761532749503 > -0.0153795976572656777bottom 列中。

如果它们相等,则必须查看 previous 列。

我认为也许dplyr 可以使用%>% 折叠行但我找不到如何根据条件同时更改行。

我希望输出看起来像这样:

            num   code ranking 
1            12    a  2414      

提前致谢。

【问题讨论】:

  • 抱歉实际上是b 而不是J.NKEN
  • 你能显示预期的输出格式吗

标签: r dplyr row collapse


【解决方案1】:

一种方法可能是group_bynumranking 查看具有相同值且需要折叠的行。

然后,将arrange(排序)按降序排列进行比较的列,包括bottompreviousof_all_previous。完成此操作后,排序数据中较高的行将考虑列,以便在存在平局时进行比较。

最后,您可以根据排序创建final_codefirst(code)

library(tidyverse)

df %>%
  group_by(num, ranking) %>%
  arrange(-bottom, -previous, -of_all_previous) %>%
  mutate(final_code = ifelse(n() > 1, as.character(first(code)), as.character(code))) %>%
  slice(1) %>%
  select(num, code, ranking)

【讨论】:

    【解决方案2】:

    也许,我们可以转为“长”格式和slice

    library(dplyr)
    library(tidyr)
    df1 %>%
       pivot_longer(cols = bottom:of_all_previous) %>%
      group_by(num, ranking, name) %>%
      slice(which.max(value)) %>% 
      ungroup %>% 
      slice(1)
    # A tibble: 1 x 5
    #    num code  ranking name      value
    #  <int> <fct>   <dbl> <chr>     <dbl>
    #1    12 b       2414. bottom -0.00652
    

    【讨论】:

    • 可能存在第一列bottom 中的值相等的情况,如果是这样,我希望代码也可以测试其余列。这可能吗?
    猜你喜欢
    • 2020-01-19
    • 2016-02-03
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2012-10-04
    相关资源
    最近更新 更多