如何将一列添加到由其他列的最小值组成的数据框中?

Posted

技术标签:

【中文标题】如何将一列添加到由其他列的最小值组成的数据框中?【英文标题】: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)) 【参考方案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)]

【讨论】:

以上是关于如何将一列添加到由其他列的最小值组成的数据框中?的主要内容,如果未能解决你的问题,请参考以下文章

将一列拆分为其他列的 SQL 命令

将一列的值用于另一列(SQL Server)?

如何用同一数据框中其他列的实际列值替换一列中的字符串值?

获取二维数组中某一列的最小值

如何通过 Pyspark 中同一数据框中另一列的正则表达式值过滤数据框中的一列

如何将一列的列值组合到 MySQL 中的另一列中?