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

How do I add a column to a data frame consisting of minimum values from other columns?

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

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

你只需:

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)

您也可以使用 data.farme(t(df)) 而不是 apply,其中 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 类型的函数使用列表并且总是很慢。

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

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

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

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

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

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

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

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

您可以使用 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)]