【问题标题】:row names supplied are of the wrong length in R提供的行名称在 R 中的长度错误
【发布时间】:2016-06-02 04:08:37
【问题描述】:

我正在运行一个计算产品描述之间相似度的 R 程序。程序的输入是一个包含 1 列的文件,其中包含产品描述列表,每个都位于单独的行中

我有另一个文件,其中包含产品标题列表,每个文件位于单独的行中。

使用 dist 函数,我计算了产品描述之间的相似性,并将它们作为矩阵存储在 dist.mat 中。

接下来,我想将产品标题加入到我计算出的相似度中。所以,我阅读了名称中的产品标题,然后:

dist.mat <- data.frame(dist.mat, row.names=Names[,1])  
colnames(dist.mat) <- (row.names(dist.mat))

然后我得到一个错误: data.frame(dist.mat, row.names = Names[, 1]) 中的错误: 提供的行名长度错误

不太确定如何修复它。我读到这个:Invalid 'row.names' length 但我无法使用 Sample$ 或 as.character 修复错误

我正在使用:lsa_0.73、SnowballC_0.5.1、tm_0.5-10

这是一个实际的例子: 产品描述文件:

  • 这个杯子可以用来喝威士忌
  • 这是不锈钢玻璃
  • 这是一朵红玫瑰

产品标题文件:

  • 威士忌酒杯
  • 玻璃
  • 玫瑰

Output Example

如果有人能帮忙就好了

【问题讨论】:

  • 您能告诉我有关Whiskeyglass 字符串的信息吗?算一两个字吗?
  • @akrun: Whiskeyglass 算作 1 个字
  • 我试图了解您是如何获得输出文件中的值的。你能更新一下逻辑吗

标签: r


【解决方案1】:

正如错误消息所说,行名与列数的长度不同,因为当我们添加带有row.names=Names[,1] 的新列时,显然会多出一列。所以,我想这可以解决

 colnames(dist.mat)[-ncol(dist.mat)] <- row.names(dist.mat)

不要将row.names列为最后一列,最好将其作为第一列

dist.mat1 <- data.frame(rn = row.names(Names[,1]), dist.mat) 
colnames(dist.mat1)[-1] <- row.names(dist.mat)

【讨论】:

  • 谢谢。现在,我有一个不同的错误:参数意味着不同的行数:0、30.. 可能是我的输入文件?
  • @user5712288 表示Names[,1]的长度与新数据集不匹配。没有可重现的例子,很难评论。
  • 我更新了一个小例子,你可能正在寻找输出样本 - 但我很难在 stackoverflow 中展示这一点,因为我不知道如何制作表格
  • @user5712288 没有输出,我们怎么知道你想要什么
  • 完成,添加截图
【解决方案2】:

向量的距离矩阵(dist 类)显示为比向量长度小一行一列的三角矩阵。

library(stringdist)

desc <- c("This glass can be used to drink whiskey",
   "This is a stainless steel glass",
   "This is a red rose")

Names <- c("Whiskeyglass", "glass", "rose")

dist.mat1 <- stringdistmatrix(desc)
dist.mat1
#    1  2
# 2 27   
# 3 24 18

但是,dist 对象没有维度,因此无法为其分配行名和列名。

dim(dist.mat1)
# NULL

尝试命名distobject 的行和列会导致错误。

row.names(dist.mat1) <- colnames(dist.mat1) <- Names

as.data.frame.default(x[[i]], optional = TRUE) 中的错误: 无法将类“dist”强制转换为 data.frame

要获得您期望的结果,首先需要将dist 对象转换为matrix。这会沿对角线添加零,因此也会添加一行和一列。

if(class(dist.mat1) == "dist"){
    dist.mat2 <- as.matrix(dist.mat1)
    row.names(dist.mat2) <- colnames(dist.mat2) <- Names
} else {
    dist.mat2 <- dist.mat1
    row.names(dist.mat2) <- colnames(dist.mat2) <- Names
}

dist.mat2
#              Whiskeyglass glass rose
# Whiskeyglass            0    27   24
# glass                  27     0   18
# rose                   24    18    0

如果您的dist.mat 看起来像上面的dist.mat1,但它的类是matrix,那么您需要选择哪些名称属于哪里。

row.names(dist.mat) <- Names[-1]             # removing the first name for rows
colnames(dist.mat) <- Names[-length(Names)]  # removing the last name for columns

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 2018-01-20
    • 2018-12-27
    • 2021-10-06
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    相关资源
    最近更新 更多