如何将一列添加到由其他列的最小值组成的数据框中?
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)]
【讨论】:
以上是关于如何将一列添加到由其他列的最小值组成的数据框中?的主要内容,如果未能解决你的问题,请参考以下文章