将应用结果分配给数据框的多列
Assign results of apply to multiple columns of data frame
我想通过对每一行应用函数 f
来处理数据框 df
中的所有行。作为具有两个元素的函数 f
returns 数值向量,我想将各个元素分配给 df
.
中的新列
示例 df
、返回两个元素的简单函数 f
以及我使用 apply
进行的试验
df <- data.frame(a = 1:3, b = 3:5)
f <- function (a, b) {
c(a + b, a * b)
}
df[, c('apb', 'amb')] <- apply(df, 1, function(x) f(a = x[1], b = x[2]))
这不起作用结果按列分配:
> df
a b apb amb
1 1 3 4 8
2 2 4 3 8
3 3 5 6 15
您需要转置 apply
结果以获得您想要的结果:
df[, c('apb', 'amb')] <- t(apply(df, 1, function(x) f(a = x[1], b = x[2])))
> df
a b apb amb
1 1 3 4 3
2 2 4 6 8
3 3 5 8 15
您也可以使用 Reduce
而不是 apply
,因为它通常效率更高。您只需要稍微修改您的函数以使用 cbind
而不是 c
f <- function (a, b) {
cbind(a + b, a * b) # midified to use `cbind` instead of `c`
}
df[c('apb', 'amb')] <- Reduce(f, df)
df
# a b apb amb
# 1 1 3 4 3
# 2 2 4 6 8
# 3 3 5 8 15
注意:只有当您只有两列(如您的示例)时,这才会很好地工作,因此如果您的数据集中有更多列,运行 这仅在一个子集上
我想通过对每一行应用函数 f
来处理数据框 df
中的所有行。作为具有两个元素的函数 f
returns 数值向量,我想将各个元素分配给 df
.
示例 df
、返回两个元素的简单函数 f
以及我使用 apply
df <- data.frame(a = 1:3, b = 3:5)
f <- function (a, b) {
c(a + b, a * b)
}
df[, c('apb', 'amb')] <- apply(df, 1, function(x) f(a = x[1], b = x[2]))
这不起作用结果按列分配:
> df
a b apb amb
1 1 3 4 8
2 2 4 3 8
3 3 5 6 15
您需要转置 apply
结果以获得您想要的结果:
df[, c('apb', 'amb')] <- t(apply(df, 1, function(x) f(a = x[1], b = x[2])))
> df
a b apb amb
1 1 3 4 3
2 2 4 6 8
3 3 5 8 15
您也可以使用 Reduce
而不是 apply
,因为它通常效率更高。您只需要稍微修改您的函数以使用 cbind
而不是 c
f <- function (a, b) {
cbind(a + b, a * b) # midified to use `cbind` instead of `c`
}
df[c('apb', 'amb')] <- Reduce(f, df)
df
# a b apb amb
# 1 1 3 4 3
# 2 2 4 6 8
# 3 3 5 8 15
注意:只有当您只有两列(如您的示例)时,这才会很好地工作,因此如果您的数据集中有更多列,运行 这仅在一个子集上