如何将数据框指定格式行名转为数值向量列?解析unlist报错原因
行名字符串拆分后
unlist报错的底层原因分析 用户试图将格式为col1 + col3 + col4的数据框行名转换为c(1,3,4)形式的数值向量列,运行以下代码时触发报错:
bel_bpa_df <- rownames_to_column(as.data.frame(bel_bpa), var = "SNPs") %>% mutate(SNPs = str_split(SNPs, "\\+")) %>% mutate(SNPs = unlist(SNPs)) %>% mutate(SNPs = parse_number(SNPs))
报错信息:
Error in `mutate()`: ! Problem while computing `SNPs = unlist(SNPs)`. ✖ `SNPs` must be size 30 or 1, not 4944. Run `rlang::last_error()` to see where the error occurred.
底层原因拆解
mutate的核心约束:dplyr::mutate要求修改或新增的列,长度必须和原数据框的行数一致(或者是长度为1的可循环值)。这里原数据框有30行,所以SNPs列必须是30个元素的向量,或者1个元素(自动重复30次)。str_split的输出本质:str_split(SNPs, "\\+")返回的是一个列表,列表长度等于原数据框的行数(30)。每个列表元素对应一行拆分后的字符向量——比如某一行拆出3个元素,另一行拆出5个,整个列表的总元素数是所有行拆分结果的长度之和(这里是4944)。unlist的行为破坏了行对应关系:unlist()会把整个列表的所有元素平铺成一个单一长向量,长度直接变成4944,完全不符合mutate要求的30行长度,因此触发报错。你本来是想让每一行保留自己的拆分结果,unlist却把所有行的结果揉成了一团,彻底打乱了行与行的对应关系。
内容的提问来源于stack exchange,提问作者monotonic
相关产品推荐
相关产品推荐

