R语言lapply函数出现Unexpected Symbol Error问题求助
解决R语言中
lapply删除列表元素行的报错问题 首先看你遇到的报错Error: unexpected symbol in "a <- lapply(data_csv, funtion(x) x",最直接的原因是你把function拼写成了funtion——少了一个c,这是语法层面的拼写错误,R解析器无法识别这个错误的单词,所以抛出了意外符号的报错。
不过除了这个拼写问题,你的delete_row函数还有几个逻辑问题需要修正,不然即使拼写对了也会运行出错:
- 函数里用到了
iter变量,但这个变量并没有在函数内部定义,也没有作为参数传入,R找不到它的取值 - 函数里引用了外部的
data_csv,但在lapply中我们是逐个处理列表里的每个元素x,应该基于当前的x来判断,而不是直接用外部的列表对象 - 你的函数只在满足条件时返回
TRUE,但如果不满足条件,函数没有明确的返回值,默认会返回NULL,这会导致x[!delete_row(x)]出现索引错误
下面是修正后的完整代码:
步骤1:修正自定义函数delete_row
delete_row <- function(x){ # 基于当前传入的x(即列表中的单个数据框)进行判断 na_8_11 <- sum(is.na(x[, 8:11])) > 2 na_12_15 <- sum(is.na(x[, 12:15])) > 2 na_16_19 <- sum(is.na(x[, 16:19])) > 2 # 满足任意一个条件就返回TRUE,否则返回FALSE return(na_8_11 || na_12_15 || na_16_19) }
步骤2:修正lapply中的拼写错误并运行
# 把funtion改成正确的function,同时子集化时保留所有列 a <- lapply(data_csv, function(x) x[!delete_row(x), ])
额外说明:
- 如果你的
data_csv是一个数据框列表,每个元素都是数据框,上面的代码会逐个对每个数据框删除满足条件的行 - 注意在子集化时要加上逗号
x[!delete_row(x), ],这样才能保留所有列,否则如果只写x[!delete_row(x)]会变成按列索引,这可能不是你想要的效果
内容的提问来源于stack exchange,提问作者Adi
相关产品推荐
相关产品推荐

