使用lapply处理数据框时所有元素返回相同值的问题排查
问题根源与解决办法
首先明确:lapply处理数据框时,是按「列」作为单位迭代的——它会把数据框的每一列(整个向量)作为参数传给你的remove_semicolon函数,而不是像sapply(rubbish[,1], ...)那样逐个单元格传递元素。
假设你的remove_semicolon函数是类似下面的写法(只针对单个字符串处理):
remove_semicolon <- function(x) { strsplit(x, ":")[[1]][1] }
当你把一整列向量传给这个函数时,strsplit(x, ":")会返回一个列表(每个元素对应列中一个单元格的分割结果),但[[1]]只会取列表的第一个元素(也就是列中第一个单元格的分割结果),然后[1]提取第一个部分,最终整个列都会被赋值为这个值(比如你看到的"0/0",应该是第一列第一个单元格的处理结果),这就是所有元素都返回"0/0"的原因。
两种解决方式
方式1:修改函数支持向量输入
把函数改成能批量处理向量的版本,这样lapply按列传递时就能正确处理每个单元格:
remove_semicolon <- function(x) { # 用sapply遍历每个元素的分割结果,提取第一个部分 sapply(strsplit(x, ":"), `[`, 1) }
之后再执行rubbish[] = lapply(rubbish, remove_semicolon),就能得到正确结果。
方式2:用rapply逐个处理单元格
如果不想修改原函数,可以用rapply递归遍历数据框的每个元素,逐个应用函数:
rubbish[] <- rapply(rubbish, remove_semicolon, how = "replace")
how = "replace"会让处理后的结果替换原数据框对应位置的元素。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

