【问题标题】:Error in `$<-.data.frame`(x, name, value) : replacement has 1 row, data has 0`$<-.data.frame`(x, name, value) 中的错误:替换有 1 行,数据有 0
【发布时间】:2020-10-01 23:57:48
【问题描述】:

运行此代码时

projectile <- data.table()
projectile$angle<- c(15, 30, 45, 60, 75)  
projectile$distance <- c(5.1, 8, 10,  8.5, 4.8)
ggplot() + geom_point( aes(projectile$angle, projectile$distance)  ) # Works
ggplot(projectile) + geom_point( aes(angle,distance) ) # Does not work

我收到此错误:

Error in `$<-.data.frame`(x, name, value) : 
  replacement has 1 row, data has 0

谁能解释一下这个错误是什么意思,为什么会出现这个错误以及如何修复它?

更新: 如果我使用data.frame,在前面的步骤也会出现同样的错误:

projectile <- data.frame()
projectile$angle<- c(15, 30, 45, 60, 75) 

错误:

Error in `$<-.data.frame`(`*tmp*`, angle, value = c(15, 30, 45, 60, 75 : 
  replacement has 5 rows, data has 0

我不立即创建data.frame(angle=c(..), distance=c(..) 的原因显然是这些值在用户稍后输入之前是未知的。

【问题讨论】:

  • 为什么不能将数据集创建为data.table(angle = c(15, 30, 45, 60, 75) , distance = c(5.1, 8, 10, 8.5, 4.8))
  • 我在帖子中说明了原因。请检查
  • 你不想在开头创建空的data.table。如果不知道这些值,你可以不先angle &lt;- c(15, 30, 45, 60, 75);distance &lt;- c(5.1, 8, 10, 8.5, 4.8); 然后projectile &lt;- data.table(angle, distance)吗?
  • 不,我不能 - 在我们的项目中,对表一无所知。然后要求学生添加一列测量值,她还没有测量它们是什么。

标签: r ggplot2 data.table


【解决方案1】:

这可能与数据集的创建方式有关。如果我们将其重新转换为data.table,它将起作用

ggplot(setDT(setDF(projectile))) + 
       geom_point( aes(angle,distance) )

data.table 被创建为 NULL 对象,然后分配了列。相反,它可以做到

projectile <- data.table(angle = c(15, 30, 45, 60, 75) , distance =  c(5.1, 8, 10,  8.5, 4.8)) 

当我们在一个 NULL 对象上赋值时,row.names 的属性长度为 0

row.names = integer(0)

当我们以适当的方式构建数据集时,它会显示

row.names = c(NA, -5L)

dput 输出中


如果我们想以 NULL 对象开头,请使用 list,然后在最后将其转换为 data.framedata.table。这样,它将添加data.frame/data.table的属性。请注意,data.framelist,其中元素(即列)的长度相同

projectile <- list()
projectile$angle<- c(15, 30, 45, 60, 75) 
projectile$distance <- c(5.1, 8, 10,  8.5, 4.8)
projectile <- data.frame(projectile)

【讨论】:

  • 这是解决问题的好方法:projectile &lt;- setDT(setDF(projectile))。现在它起作用了! - 但是,它仅适用于data.table,这对我来说是完美的,因为不久前停止使用data.frame 支持data.tabledata.frame 有同样简单的方法吗?
  • @IVIM 你需要分配row.names(projectile) &lt;- NULL
  • @IVIM 如果要从头开始创建,请从list 开始,然后将其转换为data.frame i.e. projectile
  • 我会推荐data.table 开发人员将其添加为新功能:能够将列添加到 NULL data.table,而无需使用任何 hack。 - 我试图将 R 介绍给我 12 年级的女儿,以完成她的物理项目。这个问题变成了一个让她吓坏了的无赖:(
  • @IVIM NULL 的初始分配没有更新行名。我会重新分配 row.names
【解决方案2】:

试试这个:

#Empty data table
projectile <- data.table()
#Add variables
projectile <- projectile[,list(angle=c(15, 30, 45, 60, 75),
                            distance=c(5.1, 8, 10,  8.5, 4.8)),]
#Plot                                 
ggplot(plotdat) + geom_point( aes(angle,distance) )

输出:

【讨论】:

    猜你喜欢
    • 2020-09-06
    • 2019-01-10
    • 2021-12-30
    • 2018-04-10
    • 2020-09-03
    • 2015-07-01
    • 1970-01-01
    • 2018-02-28
    • 2020-06-29
    相关资源
    最近更新 更多