data.table:如何将字符向量传递给函数 get data.table 以将其内容视为列名?

2024-02-21

这是一个数据表:

library(data.table)
DT <- data.table(airquality)

这个例子产生了我想要的输出:

DT[, `:=`(New_Ozone= log(Ozone), New_Wind=log(Wind))]

我怎样才能写一个函数log_those_columns这样下面的代码片段会输出相同的结果吗?

old_names <- c("Ozone", "Wind")
new_names <- c("New_Ozone", "New_Wind")
log_those_columns(DT, old_names, new_names)

请注意,我需要old_names and new_names足够灵活以包含任意数量的列。

(我从有关该主题的类似 StackOverflow 问题中看到,答案可能涉及以下内容的某种组合.SD, with=F, parse(), eval(),和/或substitute(),但我似乎无法确定使用哪些以及在哪里使用)。


拾取迈克尔·奇里科的评论 https://stackoverflow.com/questions/59232260/r-data-table-how-do-i-pass-a-character-vector-to-a-function-get-data-table-to-t#comment104677773_59232369,函数定义可以写为:

log_those_columns <- function(DT, cols_in, cols_new) {
  DT[, (cols_new) := lapply(.SD, log), .SDcols = cols_in]
}

返回:

log_those_columns(DT, old_names, new_names)
DT
     Ozone Solar.R Wind Temp Month Day New_Ozone New_Wind
  1:    41     190  7.4   67     5   1  3.713572 2.001480
  2:    36     118  8.0   72     5   2  3.583519 2.079442
  3:    12     149 12.6   74     5   3  2.484907 2.533697
  4:    18     313 11.5   62     5   4  2.890372 2.442347
  5:    NA      NA 14.3   56     5   5        NA 2.660260
 ---                                                     
149:    30     193  6.9   70     9  26  3.401197 1.931521
150:    NA     145 13.2   77     9  27        NA 2.580217
151:    14     191 14.3   75     9  28  2.639057 2.660260
152:    18     131  8.0   76     9  29  2.890372 2.079442
153:    20     223 11.5   68     9  30  2.995732 2.442347

正如预期的那样。

更灵活的方法

用于转换数据的函数也可以作为参数传递:

fct_those_columns <- function(DT, cols_in, cols_new, fct) {
  DT[, (cols_new) := lapply(.SD, fct), .SDcols = cols_in]
}

通话:

fct_those_columns(DT, old_names, new_names, log)
head(DT)

按预期工作:

   Ozone Solar.R Wind Temp Month Day New_Ozone New_Wind
1:    41     190  7.4   67     5   1  3.713572 2.001480
2:    36     118  8.0   72     5   2  3.583519 2.079442
3:    12     149 12.6   74     5   3  2.484907 2.533697
4:    18     313 11.5   62     5   4  2.890372 2.442347
5:    NA      NA 14.3   56     5   5        NA 2.660260
6:    28      NA 14.9   66     5   6  3.332205 2.701361

函数名称可以作为字符传递:

fct_those_columns(DT, old_names, new_names, "sqrt")
head(DT)
   Ozone Solar.R Wind Temp Month Day New_Ozone New_Wind
1:    41     190  7.4   67     5   1  6.403124 2.720294
2:    36     118  8.0   72     5   2  6.000000 2.828427
3:    12     149 12.6   74     5   3  3.464102 3.549648
4:    18     313 11.5   62     5   4  4.242641 3.391165
5:    NA      NA 14.3   56     5   5        NA 3.781534
6:    28      NA 14.9   66     5   6  5.291503 3.860052

或作为匿名函数:

fct_those_columns(DT, old_names, new_names, function(x) x^(1/2))
head(DT)
   Ozone Solar.R Wind Temp Month Day New_Ozone New_Wind
1:    41     190  7.4   67     5   1  6.403124 2.720294
2:    36     118  8.0   72     5   2  6.000000 2.828427
3:    12     149 12.6   74     5   3  3.464102 3.549648
4:    18     313 11.5   62     5   4  4.242641 3.391165
5:    NA      NA 14.3   56     5   5        NA 3.781534
6:    28      NA 14.9   66     5   6  5.291503 3.860052

更灵活的方法

下面的函数通过在输入列的名称前面自动添加函数名称来派生新列的名称:

fct_those_columns <- function(DT, cols_in, fct) {
  fct_name <- substitute(fct)
  cols_new <- paste(if (class(fct_name) == "name") fct_name else fct_name[3], cols_in, sep = "_")
  DT[, (cols_new) := lapply(.SD, fct), .SDcols = cols_in]
}

DT <- data.table(airquality)
fct_those_columns(DT, old_names, sqrt)
fct_those_columns(DT, old_names, data.table::as.IDate)
fct_those_columns(DT, old_names, function(x) x^(1/2))
DT
     Ozone Solar.R Wind Temp Month Day sqrt_Ozone sqrt_Wind as.IDate_Ozone as.IDate_Wind x^(1/2)_Ozone x^(1/2)_Wind
  1:    41     190  7.4   67     5   1   6.403124  2.720294     1970-02-11    1970-01-08      6.403124     2.720294
  2:    36     118  8.0   72     5   2   6.000000  2.828427     1970-02-06    1970-01-09      6.000000     2.828427
  3:    12     149 12.6   74     5   3   3.464102  3.549648     1970-01-13    1970-01-13      3.464102     3.549648
  4:    18     313 11.5   62     5   4   4.242641  3.391165     1970-01-19    1970-01-12      4.242641     3.391165
  5:    NA      NA 14.3   56     5   5         NA  3.781534           <NA>    1970-01-15            NA     3.781534
 ---                                                                                                               
149:    30     193  6.9   70     9  26   5.477226  2.626785     1970-01-31    1970-01-07      5.477226     2.626785
150:    NA     145 13.2   77     9  27         NA  3.633180           <NA>    1970-01-14            NA     3.633180
151:    14     191 14.3   75     9  28   3.741657  3.781534     1970-01-15    1970-01-15      3.741657     3.781534
152:    18     131  8.0   76     9  29   4.242641  2.828427     1970-01-19    1970-01-09      4.242641     2.828427
153:    20     223 11.5   68     9  30   4.472136  3.391165     1970-01-21    1970-01-12      4.472136     3.391165

注意x^(1/2)_Ozone在 R 中不是语法上有效的名称,需要放在反引号中:

DT$`x^(1/2)_Ozone`
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

data.table:如何将字符向量传递给函数 get data.table 以将其内容视为列名? 的相关文章

  • 在 R 传单中添加不透明度滑块

    如何在 R leaflet 应用程序中添加滑块来控制特定图层的不透明度 对于这个应用程序 我不想使用闪亮 这里建议 在 R 传单应用程序中添加滑块 https stackoverflow com questions 37682619 add
  • R中的字典数据结构

    在 R 中 我有 例如 gt foo lt list a 1 b 2 c 3 如果我输入foo I get a 1 1 b 1 2 c 1 3 我怎样才能看透foo仅获取 键 列表 在这种情况下 a b c R 列表可以具有命名元素 因此可
  • R 可以创建带有可单击条形图的条形图图像以插入网页吗?

    我知道如何创建条形图 以及如何将其粘贴在网页上 例如 使用hwriteImage in the 作家包 http www embl de gpau hwriter 我想要的是每个栏都是一个在鼠标悬停时突出显示的区域 并且每个栏在单击时都有不
  • 检查对以下内容的理解:“变量”与“变量” “价值”、“功能”与“抽象”

    这个问题是后续问题this one https stackoverflow com questions 25327705 is function a sort of variable 25329157 25329157在学习 Haskell
  • R 闪亮仪表板中的动态重复条件面板

    我正在尝试创建一个动态条件面板 所以我的条件如下 在用户界面中输入 selectInput inpt Input Number seq 1 50 1 selectize FALSE 我的条件面板 UI 输入是 conditionalPane
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 需要在R中按行绑定列表数据

    我在 R 中按行绑定列表时遇到问题 我的列表数据集是 id 1 data k 1 id k b c 1 1 1 3 data k 2 id k b c 1 2 1 4 id 2 data k 1 id k b c 2 1 1 6 data
  • XSL字符串多重替换功能

    如何让这个函数进行多重替换 经验 替换aaa with 111并替换bbb with 222 etc
  • 在R中循环子文件夹

    我正在 R 环境中包含多个子文件夹的文件夹中工作 我想要循环遍历多个子文件夹 然后在每个子文件夹中调用 R 脚本来执行 我想出了下面的代码 但我的代码似乎添加了 到子文件夹列表 我收到错误 文件中的错误 文件名 r 编码 编码 无效的 描述
  • 实现 XGboost 自定义目标函数

    我正在尝试使用 XGboost 实现自定义目标函数 在 R 中 但我也使用 python 所以有关 python 的任何反馈也很好 我创建了一个返回梯度和粗麻布的函数 它工作正常 但是当我尝试运行 xgb train 时它不起作用 然后 我
  • 我可以使用哪个 R 函数来查找两条线的交点?

    我刚刚研究了 stackoverflow 上所有的 在 R 中寻找交集 问题 它们要么是关于曲线 要么是关于分布像这个 https stackoverflow com questions 20519431 finding point of
  • `dplyr::_join` 函数的命名向量“by”参数[重复]

    这个问题在这里已经有答案了 我正在写一个函数dplyr join两个数据框by不同的列 第一个数据帧的列名称动态指定为函数参数 我相信我需要使用rlang准引用 元编程 但未能找到可行的解决方案 我很感激任何建议 library dplyr
  • R Shiny:如何将无功值从闪亮模块返回到主服务器功能?

    我有一个简单的玩具示例 它使用 add removeBtn 模块在 第一个 模块中添加和删除 UI 我需要跟踪单击 添加 删除 的次数 如果我不使用模块 这很容易 但我试图在嵌套模块的上下文中执行此操作 代码如下 但基本上 我似乎无法访问主
  • 在r中的某个阈值处破坏 cumsum() 函数

    例如我有以下代码 cumsum 1 100 我想打破它 如果一个元素 i 1 大于3000 我怎样才能做到这一点 因此 而不是这个结果 1 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 15
  • R,使用具有两种以上可能性的二项式分布

    我知道这可能是基本的 但我似乎有一个心理障碍 假设您想要计算在一个骰子上掷出 4 5 或 6 的概率 在 R 中 这很简单 sum 1 6 1 6 1 6 这给出了 1 2 这是正确答案 然而 我内心深处 可能应该保留的地方 认为我应该能够
  • 在网格中制作一个矩形图例,并标记行和列

    我有一个 ggplot 我将因子映射到填充和 alpha 如下所示 set seed 47 the data lt data frame value rpois 6 lambda 20 cat1 rep c A B each 3 cat2
  • R中IF函数的使用

    我正在短跑ifR 中的函数 但收到以下警告消息 In if runif 50 0 1 lt 0 69 the condition has length gt 1 and only the first element will be used
  • 如何为自定义 S3 类实现提取/取子集 ([ [<-, [[ [[<-)] 函数?

    我有一个自定义的 S3 类foo 它在正常的基础上添加了一些自定义行为data frame foo object lt data frame class foo object lt c foo data frame 对于这个类 还应该有一个
  • 当将遗传算法与 lme4 一起使用时,glmulti 无限期运行

    我在 R 中使用 glmulti 进行模型平均 我的模型中有大约 10 个变量 使得详尽的筛选不切实际 因此我需要使用遗传算法 GA 调用 method g 我需要包含随机效应 因此我使用 glmulti 作为 lme4 的包装器 此处提供
  • 需要在R中跳过不同数量的行

    我正在使用以下代码来处理我的数据 但最近我意识到使用skip 27 在数据开始之前跳过存储在我的文件中的信息 不是一个好的选择 因为每个文件中要跳过的行数不同我的目标是读取存储在多个文件夹中的各种txt文件 并非所有文件都有相同的列数 列的

随机推荐

  • 从表 b 更新表 a 其中(条件)

    晚上大家 事实上 已经是晚上了 晚上11点左右 我的大脑正在停止运转 我需要一些帮助 这样我才能完成并回家 我有两张表 表 a 和表 b 当其他两个字段匹配时 我需要使用表 b 中的字段值更新表 a 中的字段 表中的每条记录没有唯一的 ID
  • 使用 xml 模式中的节点填充 opcua 地址空间

    我正在开展一个项目 根据规范构建 opc ua 服务器 我在实现方面已经走得足够远 目前正在处理写入请求 我已经在服务器地址空间中有一些节点 看起来有很多节点 实际上也有很多 几乎不可能创建 并一一添加节点 无论如何回到问题 我已经从 op
  • shell 参数名称后带有井号和百分号的语法[重复]

    这个问题在这里已经有答案了 请解释以下语法 i i 我明白它在做什么 但我想知道一般模式 为什么 如何这样做 出现的代码 bin bash recursive name change cd 1 for i in do echo i if d
  • 当引用父对象字段、属性或方法时,“base”和“this”之间有什么区别吗?

    考虑以下代码 public class Vehicle public void StartEngine Code here public class CityBus Vehicle public void MoveToLocation Lo
  • 如何将 C 数组映射到 C#?

    我的问题与尝试从 C 调用用 C 编写的函数有关 我查看了 C 库附带的头文件 以了解 C dll 中存在的函数 这是我所看到的 C 代码 对于名为 LocGetLocations 的函数 typedef enum eLocNoError
  • 正确的 Proguard 配置以保持静态内部类

    我有以下内容 public class A extends B static class C Object field1 int field2 boolean field3 I cannot通过反射得到C类 我尝试过以下方法 keep cl
  • 如何反转可变参数模板函数的参数顺序?

    我有一个模板函数 with 可变参数模板参数 像这样 template
  • 如何调试Go语言编写的程序?

    如何调试 Go 程序 我一直在使用Gedit Go IDE http gohelp wordpress com 但它没有调试功能 有没有办法单步执行我的代码并检查内存 或者我被打印语句困住了 我可以用吗输出调试字符串 http msdn m
  • 高度未知的 CSS 粘性页脚

    有没有办法使用 CSS 将页脚粘贴到浏览器屏幕的底部或内容后面 取决于哪个更长 without提前知道页脚的大小 现在 我在保存页脚和内容的容器中使用绝对定位 容器的最小高度为 100 但是如果我更改页脚 我发现我必须更改容器底部的填充以匹
  • 反序列化包含 java.lang.CharSequence 成员变量的类

    我有一个简单的类包含name类型变量java lang CharSequence class Person public java lang CharSequence name 当我尝试使用 GSON 库反序列化 JSON 字符串时 Per
  • Dashing 无法在 Heroku 上运行

    我正在尝试将 Dashing 部署到 Heroku 一切都在本地主机上完美运行 按照 github 页面提供的说明进行部署 这似乎与向后移植宝石有关 以下是heroku日志文件 2014 11 26T21 12 22 141799 00 0
  • 在python中将多个Excel文件(xlsx)附加在一起

    import pandas as pd import os import glob all data pd DataFrame for f in glob glob output test xlsx df pd read excel f a
  • d3:绘制累积图

    Does d3 https d3js org 有内置方法将数据集绘制为累积图吗 例如 如果 y 值为 2 4 2 2 我希望它们实际上被绘制为 2 6 8 10 d3 有办法做到这一点还是我必须遍历数据集并手动执行此操作 你可以检查http
  • git clone 在不同服务器上产生不同的权限

    在一台服务器上执行 git clone git github com blasto333 PHP Point Of Sale git 时 文件权限是 我显示一个文件 但所有文件都是这样 rw r r 1 chrism chrism 3297
  • 如何将参数传递给角度2中的POST方法

    我想将参数传递给 Angular 2 中的 POST 方法 但我使用时它不起作用params new httpParams set 但它没有起作用 我也尝试过params new httpParams set 和 headers然后它也不起
  • 无法查看.Net Core bitbucket pipelines 测试结果

    我终于设法通过以下命令在 bitbucket 管道中制作测试报告 dotnet test MyTests logger trx LogFileName test reports results xml 构建拆解 说 Found matchi
  • 查询优化和 API 限制

    我们正在跟踪许多客户的 Facebook 页面和帖子指标 根据开发人员见解控制台 见解 gt 开发人员 gt 活动和错误 该文档对 Graph API 的限制和限制有些不清楚 我们只是想确保我们对可用的资源有正确的理解 我们正在努力优化我们
  • 在 Windows 10 上禁用 NPM run dev 不编译资产并为用户提供错误通知

    我最近重新安装了 Windows 10 操作系统 运行时npm install command npm 安装正确 然而 在运行npm run watch命令或npm run dev命令 资产未编译 显示以下消息 通知被禁用原因 Disabl
  • LDAP:过滤多个UID

    我正在尝试为一个团队设置 mediawiki 并且希望仅对一组用户进行 LDAP 身份验证 我知道我可以提出组 LDAP 身份验证 但是有没有一种快捷方式可以仅过滤一组 uid 进行身份验证 您可以使用的 LDAP 搜索过滤器是 uid a
  • data.table:如何将字符向量传递给函数 get data.table 以将其内容视为列名?

    这是一个数据表 library data table DT lt data table airquality 这个例子产生了我想要的输出 DT New Ozone log Ozone New Wind log Wind 我怎样才能写一个函数