将值分配给特定的 data.table 列和行

2024-03-21

仍然理解这个伟大的包...有人可以解释一下这个错误的原因吗?谢谢!

library(data.table)

DT <- data.table(id   = LETTERS,
                 var1 = rnorm(26),
                 var2 = rnorm(26))

> DT[2, list(var1, var2)]
            var1          var2
1: -0.8628479332 -0.2367492928
> DT[2, c(var1, var2)]
[1] -0.8628479332 -0.2367492928
> 
> DT[2, list(var1, var2)] <- DT[8, list(var1, var2)]
Error in `[<-.data.table`(`*tmp*`, 2, list(var1, var2), value = list(var1 = -0.394006912428776,  : 
  object 'var1' not found
> DT[2, c(var1, var2)] <- DT[8, c(var1, var2)]
Error in `[<-.data.table`(`*tmp*`, 2, c(var1, var2), value = c(-0.394006912428776,  : 
  object 'var1' not found

首先,建议使用:=代替[<-为了效率。这[<-主要是为了向后一致性而提供的。因此,我将首先说明如何有效地使用:=得到你想要的东西。:=是通过引用分配(并且它更新 data.table 而不复制数据,因此极其 fast).

require(data.table)
DT <- data.table(x = 1:5, y = 6:10, z = 11:15)

假设您要将“y”的第 2 行更改为“y”的第 5 行:

DT[2, y := DT[5, y]] 

或同等地

DT[2, `:=`(y = DT[5, y])]

假设你想改变第二行both将“y”和“z”替换为第 5 行中相应条目的值,然后:

DT[2, c("y", "z") := as.list(DT[5, c(y, z)])]

或同等地

DT[2, `:=`(y = DT[5, y], z = DT[5, z])]

现在只是向您展示如何分配使用[<-(虽然显然不推荐),可以按如下方式完成:

DT <- data.table(x = 1:5, y = 6:10, z = 11:15)
DT[1, c("y", "z")] <- as.list(DT[5, c(y, z)])

或者等效地,您也可以传递列号:

DT[1, 2:3] <- as.list(DT[5, c(y, z)])

希望这可以帮助。


Edit 1

至于为什么会出现错误:

首先,RHS 必须是一个列表[<-data.table如果要分配的列超过 1 列。

Second, j左边的参数<-不在您的 data.table 环境中进行评估。所以,它需要知道什么是值j是。既然你提供了var1 and var2 (没有双引号这将使它们成为字符向量),它被理解为一个变量。因此,它检查变量var1 and var2,但因为它不会将 data.table 中的列“视为”变量(就像您在 RHS 上进行赋值等时通常所做的那样)<-),它会在其父环境(即全局环境)中查找相同的变量,但找不到它们,因此您会收到错误。例如:这样做:

y <- "y"
z <- "z"
# And now try your second case: 
DT[2, c(y, z)] <- as.list(DT[5, c(y, z)])
# the left side takes values from the assignments you made above
# the right side y and z are evaluated within the environment of your data.table
# and so it sees the columns y and z as variables and their values are picked accordingly

第三,[<-data.table函数只接受atomic(向量)类型j争论。所以,你的第一个任务DT[2, list(var1, var2)] <- DT[8, list(var1, var2)]如果你按照正确的方式执行,仍然会报错,即:

y <- "y"
z <- "z"
DT[2, list(y, z)] <- as.list(DT[5, c(y, z)])

# Error in `[<-.data.table`(`*tmp*`, 2, list(y, z), value = list(10L, 15L)) : 
#   j must be atomic vector, see ?is.atomic

希望这可以帮助。


Edit 2

只是为了说明当您这样做时正在制作 data.table 的副本[<-但不是当:=,

DT <- data.table(x = 1:5, y = 6:10, z = 11:15)
tracemem(DT)
# [1] "<0x7fbefb89b580>"

DT[1, c("y", "z") := list(100L, 110L)]
tracemem(DT)
# [1] "<0x7fbefb89b580>"

DT[2, c("y", "z")] <- list(200L, 201L)
# tracemem[0x7fbefacc4fa0 -> 0x7fbefd297838]: # copied, inefficient
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将值分配给特定的 data.table 列和行 的相关文章

随机推荐

  • 无法使用 Javascript 更改

    在 Chromium 7 0 517 44 64615 Ubuntu 10 10 上 我似乎无法更改type的属性
  • CMake 抛出错误:无法加载缓存

    我正在尝试建立滴滴19 0 http dlib net release notes html例子 我做到了 cd examples mkdir build cd build cmake cmake build 现在获取exe cmake b
  • 如何使用 java 更改 Nimbus 外观和感觉的背景颜色

    在 Java Swing 应用程序中 我正在尝试 nimbus 的外观和感觉 它在 JdesktopPane 控件中看起来非常好 但我希望我的所有桌面窗格具有不同的颜色 但主题很好 有什么方法可以改变 Nimbus 外观和感觉的背景颜色吗
  • PHP中如何分割汉字?

    我需要一些关于如何在 PHP 中拆分与英文单词和数字混合的汉字的帮助 例如 如果我读到 FrontPage 2000中文版應用大全 我希望得到 FrontPage 2000 中 文 版 應 用 大 全 or FrontPage 2 0 0
  • Android Studio 中 gitIgnore 文件放在哪里?

    我正在开发一个应用程序 我必须将该项目带到 GitHub 现在 我必须制作 gitIgnore 文件 我知道该文件用于忽略我的项目中的某些指定文件 我使用了 gitIgnore io 服务并收到了生成的文件 这是我的 gitIgnore 文
  • 宅基地安装

    我不知道我在哪里犯了错误 我的命令vagrant up回复以下几行 vagrant up Check your Homestead yaml file the path to your private key does not exist
  • Rails 和 Mutli Nesting 中的祖先宝石

    我正在使用 Rails 中的祖先 gem 来嵌套一些注释 我想要的是让您能够获取所有注释 然后将它们全部嵌套 当我输入时 我如何得到以下信息 comments post comments arrange serializable进入我的评论
  • 仅在Gitlab CI中测试失败,本地成功

    我刚刚开始使用 Gitlab CI 使用 docker 执行器 在面对并解决了一些初学者的问题之后 我现在面临着一个非常奇怪的问题 我所有的单元测试都在本地成功 但是当我使用 CI 运行它们时 其中一些测试失败了 一个例子 2018 12
  • 如何等待鼠标点击

    class GameFrameClass extends javax swing JFrame public void MyFunc UserButton setText Str UserButton addActionListener n
  • 无法访问通过 Visual Studio 创建的数据库?

    我已经创建了一个数据库电子邮件数据库 它存储在 C Program Files Microsoft SQL Server MSSQL10 MSSQLSERVER MSSQL DATA 在 Visual Studio 中 我使用Server
  • 实现多个接口是否违反单一职责原则?

    From 维基百科 http en wikipedia org wiki Single responsibility principle 单一责任原则规定每个类都应该有一个 单一责任 并且该责任应该完全由 由类封装 这是否意味着实现多个接口
  • Mongoid has_and_belongs_to_many 关联

    我试图让 mongoid 来保存关联 但我只能让一侧工作 如果我有以下测试 test should add a user as a follower when a user follows the group do cali group f
  • 没有“isPresent()”检查的“Optional.get()”

    我有以下 Java 搜索代码 return getTableViewController getMe getColumns stream filter gt Database equalsColumnName getId columnId
  • ActionController::Live 是否可以检查连接是否仍然有效?

    我正在尝试使用 Rails 4 的实时流媒体来实现文本 事件流 它工作得很好 我遇到的唯一麻烦是我无法在不发送任何消息的情况下检查连接是否有效 我想到的唯一解决方案是使用循环刻度生成器创建支持通道 以便某些后台任务会定期向那里发送消息 但看
  • 调用构造函数重新初始化对象

    是否可以使用类的构造函数重新初始化类的对象 有点 给定 A 类 A a a A 最后一条语句不是初始化 而是赋值 但它可能会执行您想要的操作
  • 如何在jboss中生成resteasy的wadl文件

    我想为我的项目生成一个 wadl 文件 该文件使用resteasy Jboss 6 4 Maven 有很多关于球衣的例子 但不是关于resteasy的 有人用它来resteasy吗 Resteasy 从 3 0 14 Final 开始支持
  • 对 Cassandra 术语感到困惑(行与分区)

    我希望有人能够消除我对 Cassandra 中的行和分区之间的区别的困惑 我认为一行将是一组列 就像在 SQL 数据库中 如架构中指定的那样 按分区键跨节点分布 并按每个分区内的集群键排序 但后来我遇到了这个教程 https academy
  • 我应该如何处理非常非常长的 URL?

    我想知道这是否是一个错误 但现在我对所有搜索 URL 都使用 GET 原因是 通过 GET Url 用户可以简单地复制地址栏上的链接并轻松共享或保存 例如 Google 似乎也使用 GET Url 表单 由于它是一个带有过滤器 排序器等的搜
  • 在nodebox opengl中向图形的边缘添加标签

    我正在尝试向图表中的每个边添加标签 如下所示 基本上上面的每个边缘都有标签在中心 当我向每个图表添加边时 我尝试添加标签 就像这样 对于图表g g add edge label edge distance 经过一番研究 我发现这样的标签是可
  • 将值分配给特定的 data.table 列和行

    仍然理解这个伟大的包 有人可以解释一下这个错误的原因吗 谢谢 library data table DT lt data table id LETTERS var1 rnorm 26 var2 rnorm 26 gt DT 2 list v