如何将一列添加到由其他列的最小值组成的数据框中?
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)]
如何将一列添加到由其他列的最小值组成的数据框中?因此,在这种情况下,要创建第三列,其值为 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)]