【问题标题】:dput's row.names are inconsistent with the ones returned from rownames(). Why?dput 的 row.names 与 rownames() 返回的不一致。为什么?
【发布时间】:2018-07-30 11:08:00
【问题描述】:

(添加了可重现的示例)。考虑以下示例:

df <- as.data.frame(matrix(c(1,2,3, 11,12,13), nrow = 2, ncol=3))
#   V1 V2 V3
# 1  1  3 12
# 2  2 11 13
rownames(df) # "1" "2"
dput(df)
# structure(list(V1 = c(1, 2), V2 = c(3, 11), V3 = c(12, 13)), .Names = c("V1", 
# "V2", "V3"), row.names = c(NA, -2L), class = "data.frame")

dputrow.names(即NA-2L)与rownames()(即12)返回的不一致。为什么?

PS1:有人可以添加dput标签吗,我没有足够的声誉来做它(即1500分)?

PS2:What's the difference between row.names() and attributes$row.names? 也有类似的问题。在链接中,使用了row.names$row.names(都带有点)。然而,在这个问题中,出现了rownamesrow.names(无点和点)。也就是说,给定的链接很有帮助,并且在很大程度上解决了问题。

【问题讨论】:

  • ?.set_row_names
  • @mt1022 .set_row_names(as.data.frame(matrix(c(1,2,3, 11,12,13), nrow = 2, ncol=3)))[[1]] # NA 所以,现在我明白了(NA, -2L) 中的NA 来自哪里。谢谢。
  • 没有。这不是NA 的来源。您应该尝试.set_row_names(nrow(df)),其中df 是您的data.frame(即as.data.frame(matrix(c(1,2,3, 11,12,13), nrow = 2, ncol=3)))。你会得到准确的c(NA, -2L)
  • @mt1022,是的,你是对的:.set_row_names(nrow(df)) # NA -2 同时给出两个组件(即NA -2),我只给出了NA

标签: r dataframe rowname


【解决方案1】:

row.names() 为您或您的程序提供阅读和理解的内容(以一致且因此可预测的格式)。

dput()attributes() 的格式提供row.names= 以了解从structure() 收到它,它与行名称存储在数据框中的内部方式有关。 c(NA, -xL) 表示它们是从 1 到 x 自动生成的名称。

以下是row.names()dput() 之间的一些有趣变化:

df1 <- data.frame(list(a = 1:3, b = 3:1))
row.names(df1) # "1" "2" "3"
dput(df1) #  row.names=c(NA, -3L)

df2 <- df1[-2,]
row.names(df2) # "1" "3"
dput(df2) # row.names=c(1L, 3L)

df2 <- df1[-1,]
row.names(df2) # "2" "3"
dput(df2) # row.names=2:3

row.names(df1) <- 3:1
row.names(df1) # "3" "2" "1"
dput(df1) # row.names=c(3L,2L,1L)

row.names(df1) <- as.numeric(c(2,3,4))
row.names(df1) # "2" "3" "4"
dput(df1) # row.names=c("2","3","4"))

只有在最后一个测试中它们是相同的,有趣的是,即使是一个数字向量又被强制为数字,两者都将它们作为字符向量返回。出于某种原因,dput() 没有选择2:4,但在第三次测试中却选择了2:3

【讨论】:

  • 感谢 Erdogan 的编辑,但在我的机器上倒数第二个 dput() 肯定给出了 row.names = 3:1(我刚刚再次检查)。因此,这种行为甚至在系统/版本或其他任何东西之间都不一致,无论如何都保持 attributes() 快乐。
  • 您提供了非常好的信息。我认为在这个问题上不会有基于系统/版本的差异。 (感兴趣的人:我的:Win10,64 位,Revolution R Enterprise32 位 7.3.0(我仍然无法消化微软的垃圾 RevoREnt),R 版本 3.1.1。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多