R语言如何按另一列条件将数据框列表列对应行设为单个NA
问题原因
之前的写法报错或结果不符合预期,核心是两个问题:
case_when要求所有分支返回值类型完全一致,直接写~NA默认返回逻辑型标量,和另一侧的列表类型cars类型不匹配,触发类型错误map(cars, NA)是错误写法:map的第二个参数需要传入函数,传入NA会触发类型转换错误;map_if的遍历逻辑是修改列表内部的每个元素,所以只会把列表里的字符串替换成NA,没法把整个列表单元格替换成单个NA值。
解决方案
方案1:适配case_when的类型要求
给NA套一层list()转成列表类型,和cars列的类型保持一致即可正常运行:
library(tidyverse) df_list %>% mutate(cars_2 = case_when( gear == 3 ~ list(NA), TRUE ~ cars ))
运行结果如下,gear=3对应的行cars_2是单个NA,其余行保留原列表:
# A tibble: 3 × 3 gear cars cars_2 <dbl> <list> <list> 1 3 <chr [15]> <lgl [1]> 2 4 <chr [12]> <chr [12]> 3 5 <chr [5]> <chr [5]>
方案2:用replace直接按条件替换
逻辑更简洁,不需要手动做类型适配:
df_list %>% mutate(cars_2 = replace(cars, gear == 3, NA))
运行结果和方案1完全一致。
内容的提问来源于stack exchange,提问作者zoowalk
相关产品推荐
相关产品推荐

