R语言按行遍历dataframe应用自定义函数报length zero错误如何解决
问题排查与解决方案
报错根因
- 你写的
wins函数第一行if(NULL)是无效逻辑:R中NULL属于长度为0的对象,该判断执行时直接触发argument is of length zero错误,这行代码完全冗余且是报错的直接原因。 - 你使用
apply按行处理数据框时,会自动将整行数据强制转换为同类型的字符向量,若数据中存在缺失值、因子类型,容易导致后续判断逻辑异常。 - 你当前函数返回的是字符串
"NULL",如果要作为数据框的新列取值,使用R原生的缺失值NA适配性更好,也符合你说的返回null值的需求。
修正后可运行代码
library(tidyverse) library(readr) # 读取数据并去重 df <- read_csv('/Users/david/Downloads/trustdata.csv') df_dups <- df[!duplicated(df), ] # 重写逻辑正确的自定义函数 wins <- function(a, b) { # 逻辑:a不等于b时返回b,否则返回缺失值 ifelse(a != b, b, NA_character_) } # 直接用tidyverse的mutate生成新列,无需手动循环 df_result <- df_dups %>% mutate(新列名 = wins(col1, col2))
匹配你给出的样本预期
用你提供的4行样本测试,输出结果和预期完全一致:
| colid | col1 | col2 | 新列名 |
|---|---|---|---|
| 1 | 无 | Blue | Blue |
| 2 | Blue | Blue | NA |
| 3 | Red | Blue | Blue |
| 4 | 无 | 无 | NA |
如果你需要新列的空值显示为字符串"Null",只需要把函数里的NA_character_替换为"Null"即可。
内容的提问来源于stack exchange,提问作者David Draper
相关产品推荐
相关产品推荐

