【问题标题】:Assign to the maximum value the ID column为 ID 列分配最大值
【发布时间】:2021-11-21 13:29:15
【问题描述】:

我有以下几点:

a <- c("ID_A", "ID_B", "Count")
b <- c("1", "1015", "19389")
c <- c("1", "1019", "206")
d <- c("1", "1027", "1210")
e <- c("2", "1019", "206")
f <- c("2", "1027", "1210")
df <- data.frame(a, b, c, d, e, f)

我想先pivot_wider,即去掉abcdef。
然后,我想提取count的最大值,创建一个新变量(mutate),它的ID_B为最大值。

类似这样,用 pivot_wider 摆脱 abcdef:

a <- c("ID_A", "ID_B", "Count", "ID_B of max value")
b <- c("1", "1015", "19389", "1015")
c <- c("1", "1019", "206", "1015")
d <- c("1", "1027", "1210", "1015")
e <- c("2", "1019", "206", "1027")
f <- c("2", "1027", "1210", "1027")
new_df <- data.frame(a, b, c, d, e, f)

我尝试了 group_by、sum、mutate。它不起作用。 请帮忙! 非常感谢

【问题讨论】:

    标签: r max


    【解决方案1】:

    您可以通过多种方式进行尝试……但是,听起来您可能对tidyverse 方法感兴趣。如果是这样,您可以同时使用pivot_longerpivot_wider 来评估最大值Count。根据您的示例,听起来对于每个ID_A,您都想要具有最大Count 值的ID_B(不清楚您希望如何处理关系,如果可能的话......在这种情况下将只使用第一个ID_B)。在您指出哪个ID_B 具有最大Count 后,您可以执行相同的操作以恢复为原始格式。

    library(tidyverse)
    
    df %>%
      pivot_longer(cols = -a, names_to = "old_vars", values_transform = list(value = as.numeric)) %>%
      pivot_wider(names_from = a) %>%
      group_by(ID_A) %>%
      mutate(ID_B_Count_Max = ID_B[Count == max(Count)[1]]) %>%
      pivot_longer(cols = -old_vars) %>%
      pivot_wider(names_from = old_vars)
    

    输出

      name               b     c     d     e     f
      <chr>          <dbl> <dbl> <dbl> <dbl> <dbl>
    1 ID_A               1     1     1     2     2
    2 ID_B            1015  1019  1027  1019  1027
    3 Count          19389   206  1210   206  1210
    4 ID_B_Count_Max  1015  1015  1015  1027  1027
    

    【讨论】:

    【解决方案2】:

    我对您的数据做了几个假设,首先您希望数字是数字,其次数据框应该被转置,以便它具有 ID_A、ID_B 和 Count 列。

    a <- c("ID_A", "ID_B", "Count")
    b <- c(1, 1015, 19389)
    c <- c(1, 1019, 206)
    d <- c(1, 1027, 1210)
    e <- c(2, 1019, 206)
    f <- c(2, 1027, 1210)
    

    我正在使用data.table 库,因此请使用您的数据创建data.table

    library(data.table)
    df <- as.data.table(rbind(b,c,d,e,f))
    names(df) <- a
    

    现在我可以创建一个名为 ID_B of max value 的新变量,它对应于 ID_B 在使 Count 最大化的值处的值。

    df[, `ID_B of max value` := .SD$ID_B[which.max(.SD$Count)] , by=ID_A]
    df
       ID_A ID_B Count ID_B of max value
    1:    1 1015 19389              1015
    2:    1 1019   206              1015
    3:    1 1027  1210              1015
    4:    2 1019   206              1027
    5:    2 1027  1210              1027
    

    这里需要注意data.table 的几个方面。首先,:= 运算符是一个特殊的赋值运算符。 .SD 表示数据的当前子集,所以by=ID_A 对应ID_A 的每个值定义的子集。

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 2021-02-03
      • 2016-04-04
      • 2021-05-31
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      相关资源
      最近更新 更多