R语言:如何在apply函数中传递当前行号?及相关报错排查
问题解答
1. 在按行处理时传递当前行号给函数
apply(margin=1) 默认会把每一行的**值(向量形式)**传给目标函数,而非行号。如果要传递行号,推荐两种更直接的实现方式:
方式一:遍历行号而非行内容
直接用 lapply/sapply 遍历数据框的行号序列,直接将行号传入函数:
my_function <- function(row_number){ old_dataframe[row_number, ] <- old_dataframe[row_number, ] * 5 } # 遍历所有行号 lapply(seq_len(nrow(old_dataframe)), my_function)
注意:避免用 <<- 全局赋值,直接在当前环境修改原数据框即可,全局赋值容易引发环境冲突问题。另外你原代码中 apply(..., my_function()) 是错误写法——第三个参数应传入函数名(my_function),而非函数调用(my_function()),后者会直接执行函数并将返回值传给apply,导致逻辑混乱。
方式二:用 apply 同时传递行号和行内容
如果一定要基于 apply 实现,可以通过 cbind 把行号和行内容绑定后传入:
my_function <- function(row_data){ row_number <- row_data[1] old_dataframe[row_number, ] <- old_dataframe[row_number, ] *5 } # 把行号作为第一列绑定到原数据框 apply(cbind(seq_len(nrow(old_dataframe)), old_dataframe), margin=1, my_function)
但这种方式冗余度较高,一般更推荐第一种方法。
2. 关于 '*' is only defined for data frames of the same size 报错
你提到两个数据框维度相同但仍报错,核心原因是 apply 处理行时会自动把行转换成向量,而非保留数据框的行结构。当你在函数中对 fsrf[2 + band, ](数据框行,仍为dataframe类型)和 fos[obs_row, ](apply传入的向量)执行乘法时,向量与dataframe的乘法规则不匹配,就会触发该错误。
解决办法:
- 统一操作对象类型:要么都转成向量,要么都保留dataframe行结构。示例:
# 转成向量后运算,再转回单行数据框赋值 result_vec <- as.vector(fsrf[2 + band, ]) * as.vector(fos[obs_row, ]) old_dataframe[row_number, ] <- as.data.frame(t(result_vec))
- 改用更适配数据框的工具:比如用
dplyr的rowwise()或purrr::imap(),它们会保留行的结构,避免类型转换问题:
library(dplyr) old_dataframe <- old_dataframe %>% rowwise() %>% mutate(across(everything(), ~ .x *5)) %>% ungroup()
内容的提问来源于stack exchange,提问作者tds
相关产品推荐
相关产品推荐

