在R中提供的行名称长度不正确

3
我正在运行一个R程序,计算产品描述之间的相似度。程序的输入是一个文件,其中有1列,包含产品描述的列表,每个描述占一行。
我还有另一个文件,其中包含产品标题的列表,每个标题占一行。
使用dist函数,我已经计算了产品描述之间的相似度,并将它们存储在dist.mat矩阵中。
接下来,我想把产品标题与我计算出的相似度进行合并。所以,我读取了Names中的产品标题,然后:
dist.mat <- data.frame(dist.mat, row.names=Names[,1])  
colnames(dist.mat) <- (row.names(dist.mat))

然后我收到一个错误: Error in data.frame(dist.mat, row.names = Names[, 1]) : row names supplied are of the wrong length
不太确定如何解决。我阅读了这篇文章:Invalid 'row.names' length,但我不能使用Sample$或as.character修复错误。
我正在使用:lsa_0.73,SnowballC_0.5.1,tm_0.5-10。
这里是一个实际的例子: 产品描述文件:
  • 这个玻璃杯可以用来喝威士忌。
  • 这是一个不锈钢杯子。
  • 这是一朵红玫瑰。
产品标题文件:
  • Whiskeyglass
  • glass
  • rose
输出示例 希望有人能提供帮助。

请问一下,“Whiskeyglass”字符串算一个词还是两个词? - akrun
@akrun:Whiskeyglass被计算为1个单词。 - user5712288
我正在试图理解您是如何获得输出文件中的值的。您能否请更新一下逻辑? - akrun
2个回答

2
正如错误消息所说,行名的长度与列数不同,因为当我们使用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] 的长度与新数据集不匹配。没有可重现的示例,很难发表评论。 - akrun
我更新了一个小例子,你可能正在寻找输出样本-但是对我来说在stackoverflow上展示它很困难,因为我不知道如何制作表格。 - user5712288
@user5712288 如果没有输出,我们怎么知道你想要什么。 - akrun
完成了,附加了屏幕截图。已完成,附加屏幕截图。 - user5712288

1

向量的距离矩阵(类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

尝试为dist对象命名行和列会导致错误。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接