gpt4 book ai didi

r - 如何为 data.frame 的每一行调用一个函数?

转载 作者:行者123 更新时间:2023-12-04 17:06:59 25 4
gpt4 key购买 nike

我有一个带有多个参数的函数。此函数返回一个 data.frame。

我有另一个 data.frame。

现在我想为 data.frame 的每一行调用我的函数(作为参数)。结果 data.frames 我想 rbind。

所以我想像

do.call(rbind, apply(df, 1, f))

是我的 friend 。

但是:在此调用期间 df 被转换为矩阵。在此过程中,所有数字都转换为字符。所以我必须修改我的函数来重新转换。这很笨拙,我怕我错过了什么。

所以我的问题是,我该怎么做?

作为示例,请参阅以下代码:
Sys.setenv(LANG = "en")
# Create data.frame
df <- data.frame(
a = c('a', 'b', 'c'),
b = c(1, 2, 3),
stringsAsFactors = FALSE
)

# My function
f <- function(x) {
data.frame(
x = rep(paste(rep(x[['a']], x[['b']]), collapse=''),x[['b']]),
y = 2 * x[['b']],
stringsAsFactors = FALSE
)
}

apply(df, 1, f)

在这里我得到错误:
Error in 2 * x[["b"]] : non-numeric argument to binary operator 

所以我将函数 f 更改为函数 g:
g <- function(x) {
data.frame(
x = rep(paste(rep(x[['a']], as.numeric(x[['b']])), collapse=''), as.numeric(x[['b']])),
y = 2 * as.numeric(x[['b']]),
stringsAsFactors = FALSE
)
}

现在我可以打电话
 do.call(rbind, apply(df, 1, g))

我得到
    x y
1 a 2
2 bb 4
3 bb 4
4 ccc 6
5 ccc 6
6 ccc 6

我尝试使用 for 循环。
result <- f(df[1,])
for(i in 2:nrow(df)){
result <- rbind(result, f(df[i,]))
}
result

那确实有效。但这不可能是 R 方式。 for 循环不是“R-ish”有太多可能出错的地方。也许 df 可以为空或只有一行。

那么 base-R 或 dplyr/tidyverse 解决方案是什么?

最佳答案

那么,apply()用于矩阵,不与 data.frames 一起使用。在这种情况下确实应该避免这种情况。最好编写采用适当参数的函数,而不是需要传递 data.frame 行。

f <- function(a, b) {
data.frame(
x = rep(paste(rep(a, b), collapse=''), b),
y = 2 * b,
stringsAsFactors = FALSE
)
}

那么你可以使用更常规的 map()样式方法(如果只使用两列,则特别容易)
purrr::map2_df(df$a, df$b, f)

使用更多列(以及与参数名称匹配的列名称),您可以使用
purrr::pmap_df(df, f)

关于r - 如何为 data.frame 的每一行调用一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48192632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com