R语言中transpose函数为何有时报错?keep.names参数未被识别
问题分析与解决
问题说明
编写的R转置数据框代码多数时候正常运行,但偶尔报错:
Error in transpose(Book5, keep.names = "rn") : unused argument (keep.names = "rn")
使用的代码:
Book5<- read_excel("C:/X/X/X/X/1.1 Croston_Aplha-0.1.xlsx") X1 <- transpose(Book5,keep.names="rn")
数据框结构:
structure(list(`Row Labels` = c("2019-01-01", "2019-02-01", "2019-03-01", "2019-04-01", "2019-05-01", "2019-06-01", "2019-07-01", "2019-08-01", "2019-09-01", "2019-10-01", "2019-11-01", "2019-12-01", "2020-01-01", "2020-02-01", "2020-03-01", "2020-04-01", "2020-05-01", "2020-06-01", "2020-07-01", "2020-08-01", "2020-09-01", "2020-10-01", "2020-11-01", "2020-12-01", "2021-01-01", "2021-02-01", "2021-03-01", "2021-04-01", "2021-05-01", "2021-06-01", "2021-07-01", "2021-08-01", "2021-09-01", "2021-10-01", "2021-11-01", "2021-12-01", "2022-01-01", "2022-02-01", "2022-03-01", "2022-04-01", "2022-05-01", "2022-06-01", "2022-07-01", "2022-08-01", "2022-09-01", "2022-10-01"), `XYZ|146` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 18, 16, 16, 17, 12, 22, 6, 7, 6, 0, 15, 0, 17, 17, 5, 19, 16, 7, 25, 19, 34, 26, 41, 50, 29, 42, 20, 14, 16, 27, 10, 28, 21), `XYZ|666` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 45, 9, 21, 33, 3, 8, 11, 16, 3, 17, 14, 59, 26, 35, 26, 15, 7, 4, 4, 2, 7, 6, 2), `XYZ|574` = c(0, 0, 0, 0, 0, 0, 0, 0, 74, 179, 464, 880, 324, 184, 90, 170, 140, 96, 78, 83, 83, 121, 245, 740, 332, 123, 117, 138, 20, 42, 70, 70, 42, 103, 490, 641, 488, 245, 142, 95, 63, 343, 57, 113, 100, 105), `XYZ|851` = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 1814, 2324, 772, 1116, 1636, 1906, 957, 829, 911, 786, 938, 1313, 2384, 1554, 1777, 1635, 1534, 1015, 827, 982, 685, 767, 511, 239, 1850, 1301, 426, 261, 201, 33, 0, 0, 0, 0, 0, 0)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -46L))
预期输出:
报错原因
核心问题是函数名冲突:
transpose并非base R自带函数,多个R包都实现了该函数,其中仅data.table包的transpose()支持keep.names参数。- 当R环境未加载
data.table包,或其他包(如dplyr)的transpose函数优先级更高时,调用的是不支持该参数的版本,从而触发报错。
解决方案
方案1:明确指定使用data.table的transpose函数
直接用包名前缀指定,彻底避免函数冲突:
# 未安装data.table则先运行:install.packages("data.table") Book5 <- read_excel("C:/X/X/X/X/1.1 Croston_Aplha-0.1.xlsx") X1 <- data.table::transpose(Book5, keep.names = "rn")
方案2:提前加载data.table包
在代码开头加载data.table包,确保后续调用的是它的transpose函数:
library(data.table) Book5 <- read_excel("C:/X/X/X/X/1.1 Croston_Aplha-0.1.xlsx") X1 <- transpose(Book5, keep.names = "rn")
方案3:用tidyverse工具实现相同转置效果
若习惯使用tidyverse生态,可通过pivot_longer+pivot_wider实现等价转置:
library(tidyverse) Book5 <- read_excel("C:/X/X/X/X/1.1 Croston_Aplha-0.1.xlsx") X1 <- Book5 %>% pivot_longer(cols = -`Row Labels`, names_to = "rn", values_to = "value") %>% pivot_wider(names_from = `Row Labels`, values_from = "value")
内容的提问来源于stack exchange,提问作者user20203146
相关产品推荐
相关产品推荐

