R中创建字符矩阵列引发排序错误,求通俗解释及学习指引
解决tidyverse中mutate引发的矩阵类型错误问题
背景:我的数据与操作
我用tidyverse构建了如下可复现的数据框:
library(tidyverse) df <- structure( list( PN = c("41681", "16588", "34881", "36917", "33116", "68447"), `2017-10` = c(0L, 0L, 0L, 0L, 0L, 0L), `2017-11` = c(0L, 1L, 0L, 0L, 0L, 0L), `2017-12` = c(0L, 0L, 0L, 0L, 1L, 0L), `2018-01` = c(0L, 0L, 1L, 1L, 0L, 0L), `2018-02` = c(1L, 0L, 0L, 0L, 0L, 0L), `2018-03` = c(0L, 0L, 0L, 0L, 0L, 0L), `2018-04` = c(0L, 0L, 0L, 0L, 0L, 1L), Status = c("OK", "NOK", "OK", "NOK", "OK", "OK") ), .Names = c("PN", "2017-10", "2017-11", "2017-12", "2018-01", "2018-02", "2018-03", "2018-04", "Status"), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame") )
接着执行了两步mutate操作:
- 初期操作:
mutate(n = parse_integer(str_replace_na(n, replacement = 0)))
- 后期触发错误的操作:
mutate( Status = ifelse( (apply(.[, 2:7], 1, sum) > 0) & (.[, 8] > 0), "NOK", "OK" ) )
遇到的错误
执行后弹出报错:
Error in arrange_impl(.data, dots) : Argument 1 is of unsupported type matrix
有开发者提示这是因为“创建了字符矩阵列”,作为R新手,我想搞懂问题到底出在哪,或者知道《R for Data Science》里该看哪些章节来补基础。
问题本质通俗拆解
咱们用大白话讲清楚:
- 首先,tidyverse里的
dplyr::mutate是用来给数据框加列或改列的,它要求每一列必须是向量——简单说就是一串同类型的数值/字符,像一根单列的小长条。 - 你用
apply(.[,2:7],1,sum)计算行求和时,apply函数默认返回的是矩阵类型(哪怕它看起来就是一列数字),再和.[,8]>0的结果(这是向量)用&组合后,整个条件判断的结果就变成了一个矩阵。 - 当你把这个矩阵赋值给
Status列时,相当于给数据框塞了一个“不符合规矩的列类型”,而tidyverse的tbl_df(整洁数据框)不允许列是矩阵,后续如果有排序(比如错误里提到的arrange)这类操作,就会因为识别不了矩阵类型而报错。
总结一下:你给数据框的列放了个它不接受的“数据类型”,所以程序炸了。
《R for Data Science》学习指引
推荐从这几个章节入手补基础,彻底搞懂这类问题:
- 第2章:Data structures:搞清楚向量、矩阵、数据框这些基础数据结构的区别,明白tidyverse工具默认处理的是哪种结构,避免混用。
- 第5章:Data transformation:重点看
mutate的用法,以及如何用dplyr原生的行级计算函数(比如rowSums,可以替代apply来做行求和,返回的是向量),这样就不会引入矩阵类型了。 - 第12章:Tidy data:理解tidy数据的规则,这能帮你明白tidyverse工具的设计逻辑,写出更符合规范的代码,减少这类错误。
内容的提问来源于stack exchange,提问作者stackinator
相关产品推荐
相关产品推荐

