【问题标题】:How do I add a column to a data frame consisting of minimum values from other columns?如何将一列添加到由其他列的最小值组成的数据框中?
【发布时间】:2022-01-07 07:26:29
【问题描述】:

如何将一列添加到由其他列的最小值组成的数据框中?那么在这种情况下,要创建第三列,其值为 1、2 和 2?

df = data.frame(A = 1:3, B = 4:2)

【问题讨论】:

  • library(tidyverse) df %>% mutate(C = pmin(A, B))

标签: r min


【解决方案1】:

您可以使用apply() 函数来执行此操作。见下文。

df$C <- apply(df, 1, min)

第二个参数允许您选择要在其中应用 min 的维度,在本例中为 1,将 min 分别应用于每行中的所有列。

您可以从数据框中选择特定的列,如下所示:

df$newCol <- apply(df[c('A','B')], 1, min)

【讨论】:

  • 谢谢,这确实回答了我的问题。但是假设一开始有三列,我只想要前两列的最小值。我可以使用 apply() 并指定我想要 A 列和 B 列的最小值吗?
  • 我将答案添加到我的答案中。请参见上文。
【解决方案2】:

您可以使用do.call 调用并行最小函数以将其应用于所有列:

df$C <- do.call(pmin, df)

【讨论】:

    【解决方案3】:
    df %>%
      rowwise() %>%
      mutate(C = min(A, B))
    
    # A tibble: 3 × 3
    # Rowwise: 
          A     B     C
      <int> <int> <int>
    1     1     4     1
    2     2     3     2
    3     3     2     2
    

    跨行使用具有相等值的输入:

    df = data.frame(A = 1:10, B = 11:2)
    df %>%
      rowwise() %>%
      mutate(C = min(A, B))
    
    # A tibble: 10 × 3
    # Rowwise: 
           A     B     C
       <int> <int> <int>
     1     1    11     1
     2     2    10     2
     3     3     9     3
     4     4     8     4
     5     5     7     5
     6     6     6     6
     7     7     5     5
     8     8     4     4
     9     9     3     3
    10    10     2     2
    

    【讨论】:

    • 如果您在行中具有相同的值,即如果 A[1] = B[1] = 1,那么在这种情况下输出应该是 1,1,2,而您会得到 1,2,2
    • @cgvoller 编辑回答你的问题了吗?
    【解决方案4】:

    你做的很简单:

    df$C <- apply(FUN=min,MARGIN=1,X=df)
    

    或者:

    df[, "C"] <- apply(FUN=min,MARGIN=1,X=df)
    

    或:

    df["C"] <- apply(FUN=min,MARGIN=1,X=df)
    

    除了apply,您还可以使用data.farme(t(df)),其中t 转置df,因为sapply 将应用给定函数逐列遍历数据框。因此,行必须成为列。由于t 始终输出一个矩阵,因此您需要再次将其设为data.frame()

    df$C <- sapply(data.frame(t(df)), min)
    

    或者可以利用 ifelse 被矢量化这一事实:

    df$C <- with(df, ifelse(A<B,A,B))
    

    或者:

    df$C <- ifelse(df$A < df$B, df$A, df$B)
    

    矩阵统计

    # install.packages("matrixStats")
    
    matrixStats::rowMins(as.matrix(df))
    

    this SO answer最快。 apply-type 函数使用列表并且总是很慢。

    【讨论】:

      【解决方案5】:

      您可以使用transform() 将min 列添加为pmin(a, b) 的输出,并在不使用索引的情况下访问df 的元素:

      df <- transform(df, min = pmin(a, b))
      

      data.table

      library(data.table)
      
      DT = data.table(a = 1:3, b = 4:2)
      DT[,  min := pmin(a, b)]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-13
        • 2014-11-05
        • 2021-12-22
        相关资源
        最近更新 更多