使用 data.table 重新编码变量

2024-04-04

我正在尝试使用 data.table 重新编码变量。我用谷歌搜索了近2个小时但找不到答案。

假设我有一个 data.table 如下:

DT <- data.table(V1=c(0L,1L,2L),
                 V2=LETTERS[1:3],
                 V4=1:12)

我想重新编码 V1 和 V2。对于 V1,我想将 1 重新编码为 0,将 2 重新编码为 1。 对于V2,我想将A重新编码为T,B重新编码为K,C重新编码为D。

如果我使用dplyr, 很简单。

library(dplyr)
DT %>% 
  mutate(V1 = recode(V1, `1` = 0L, `2` = 1L)) %>% 
  mutate(V2 = recode(V2, A = "T", B = "K", C = "D"))

但我不知道如何在 data.table 中执行此操作

DT[V1==1, V1 := 0]
DT[V1==2, V1 := 1]
DT[V2=="A", V2 := "T"]
DT[V2=="B", V2 := "K"]
DT[V2=="C", V2 := "D"]

上面是我认为最好的代码。但必须有更好、更有效的方法来做到这一点。


Edit

我改变了重新编码 V2 的方式,使我的示例更加通用。


With data.table重新编码可以通过以下方式解决加入时更新:

DT[.(V1 = 1:2, to = 0:1), on = "V1", V1 := i.to]
DT[.(V2 = LETTERS[1:3], to = c("T", "K", "D")), on = "V2", V2 := i.to]

哪个转换DT to

    V1 V2 V4
 1:  0  T  1
 2:  0  K  2
 3:  1  D  3
 4:  0  T  4
 5:  0  K  5
 6:  1  D  6
 7:  0  T  7
 8:  0  K  8
 9:  1  D  9
10:  0  T 10
11:  0  K 11
12:  1  D 12

Edit:@Frank 建议使用i.to为了安全起见。

解释

表达式.(V1 = 1:2, to = 0:1) and .(V2 = LETTERS[1:3], to = c("T", "K", "D"))分别创建查找表即时.

或者,可以预先设置查找表

lut1 <- data.table(V1 = 1:2, to = 0:1)
lut2 <- data.table(V2 = LETTERS[1:3], to = c("T", "K", "D"))

lut1
   V1 to
1:  1  0
2:  2  1
lut2
   V2 to
1:  A  T
2:  B  K
3:  C  D

然后,更新连接 become

DT[lut1, on = "V1", V1 := i.to]
DT[lut2, on = "V2", V2 := i.to]

编辑2:答案我如何动态地使用此代码?

马特问 https://stackoverflow.com/questions/44590935/recode-a-variable-using-data-table/44592473?noredirect=1#comment125605674_44592473 "我如何动态地使用此代码?"

因此,这是一个修改版本,其中要更新的列的名称作为字符变量提供my_var_name但查找表仍然被创建即时:

my_var_name <- "V1"
DT[.(from = 1:2, to = 0:1), on = paste0(my_var_name, "==from"), 
   (my_var_name) := i.to]
my_var_name <- "V2"
DT[.(from = LETTERS[1:3], to = c("T", "K", "D")), on = paste0(my_var_name, "==from"), 
   (my_var_name) := i.to]

有3点需要注意:

  1. 它不是动态命名查找表的第一列,而是获得固定名称from。这需要不同命名的列之间的联接(外键连接)。必须通过以下方式指定要加入的列的名称on范围。
  2. The on参数接受字符串外键连接形式的"V1==from"。该字符串是使用动态创建的paste0().
  3. 在表达式中(my_var_name) := i.to,变量两边的括号my_var_name强制使用内容my_var_name.

使用预定义查找表的动态代码

现在,虽然要重新编码的列是由变量动态指定的,但要使用的查找表仍然是硬编码的在语句中这意味着我们已经中途停止了:我们还需要动态选择适当的查找表。

这可以通过将查找表存储在列表中来实现,其中每个列表元素根据以下列命名DT它应该重新编码:

 lut_list  <- list(
  V1 = data.table(from = 1:2, to = 0:1),
  V2 = data.table(from = LETTERS[1:3], to = c("T", "K", "D"))
)
lut_list
$V1
    from    to
   <int> <int>
1:     1     0
2:     2     1

$V2
     from     to
   <char> <char>
1:      A      T
2:      B      K
3:      C      D

现在,我们也可以从列表中动态选择适当的查找表:

my_var_name <- "V1"
DT[lut_list[[my_var_name]], on = paste0(my_var_name, "==from"), 
   (my_var_name) := i.to]

更进一步,我们可以重新编码all的相关栏目DT in a loop:

for (v in intersect(names(lut_list), colnames(DT))) {
  DT[lut_list[[v]], on = paste0(v, "==from"), (v) := i.to]
}

注意DT is 通过参考更新,即仅替换受影响的元素in place而不复制整个对象。所以for循环迭代地应用于同一数据对象。这是一个专业数据表 /questions/tagged/data.table并且不适用于 data.frames 或 tibbles。

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

使用 data.table 重新编码变量 的相关文章

  • 如何获得 STAN 中最大似然估计的标准误差?

    我在 Stan 中使用最大似然优化 但不幸的是optimizing 函数不报告标准错误 gt MLb4c lt optimizing get stanmodel fitb4c data win data init inits STAN OP
  • R中添加水印

    我在用magickR中的库 我想在一些图片上添加水印 I used image annotate功能如下 img lt image read C Users Maydin Desktop manzara png image annotate
  • 使用 R Shiny 从 XLConnect 下载 Excel 文件

    有没有人尝试过使用 R Shiny 中的下载处理程序通过 XLConnect 下载新创建的 Excel 文件 在 ui R 中有一行不起眼的行 downloadButton downloadData Download 在 server R
  • ggplot2可以在一个图例中分别控制点大小和线大小(线宽)吗?

    一个使用的例子ggplot2绘制数据点组和连接每组均值的线 并使用相同的映射aes for shape并为linetype p lt ggplot mtcars aes gear mpg shape factor cyl linetype
  • 基于另一个数据集获取数据集的子集

    假设我有一个数据集 即 dat1 ID block plot SPID TotHeight 1 1 1 4 44 5 2 1 1 4 51 3 1 1 4 28 7 4 1 1 4 24 5 5 1 1 4 27 3 6 1 1 4 20
  • 将年月格式转换为 POSIXct [重复]

    这个问题在这里已经有答案了 我有一些年月形式的数据 我想将其格式化以用于绘图ggplot date lt c 2016 03 2016 04 2016 05 2016 06 2016 07 2016 08 2016 09 2016 10 2
  • numpy.histogram 的 hist 维度,密度 = True

    假设我有这个数组 A array 0 0019879 0 00172861 0 00527226 0 00639585 0 00242005 0 00717373 0 00371651 0 00164218 0 00034572 0 008
  • 删除ggplot2中的负图区域[重复]

    这个问题在这里已经有答案了 如何删除 ggplot2 中 x 轴和 y 轴下方的绘图区域 请参见下面的示例 我尝试了几个主题元素 panel border panel margin plot margin 但没有任何运气 p lt ggpl
  • 如何从 Fortran 调用 R 函数?

    根据http gallery rcpp org articles r function from c http gallery rcpp org articles r function from c Rcpp 允许用户从 C 调用 R 函数
  • 在shiny中过滤传单地图数据

    我在用传单地图设置这个闪亮的东西时遇到了麻烦 我的原帖 https stackoverflow com questions 50111566 applying leaflet map bounds to filter data within
  • IEnumerable 作为 DataTable 性能问题

    我有以下扩展 它生成一个DataTable从一个IEnumerable public static DataTable AsDataTable
  • 纵向序列数据的三次样条方法?

    我有一个串行数据 格式如下 time milk Animal ID 30 25 6 1 31 27 2 1 32 24 4 1 33 17 4 1 34 33 6 1 35 25 4 1 33 29 4 2 34 25 4 2 35 24
  • 如何使用 R 计算成为列表中中位数的概率?

    假设我有以下数据集 其中显示了假设实验的每个状态的三个观察结果的列表 state lt c Iowa Minnesota Illinois outcome lt list c 5 11 11 c 3 12 8 c 9 14 2 dat lt
  • kernlab 中 SVM 训练之外的核矩阵计算

    我正在开发一种新算法 该算法可以生成修改后的核矩阵以用于 SVM 训练 但遇到了一个奇怪的问题 出于测试目的 我比较了使用 kernelMatrix 接口和普通内核接口学习的 SVM 模型 例如 Model with kernelMatri
  • 在 R 中创建虚拟变量,排除某些情况为 NA

    我的数据看起来像这样 V1 V2 A 0 B 1 C 2 D 3 E 4 F 5 G 9 我想创建一个虚拟变量R where 0 1 1 2 3 4 and NA 0 5 9 应该很简单 有人可以帮忙吗 我们可以转换V2 into a fa
  • Purrr::map_df() 删除 NULL 行

    使用时purrr map df 我偶尔会传递一个数据框列表 其中一些项目是NULL 当我做 map df 返回行数少于原始列表的数据框 我想发生的事情是这样的map df calls dplyr bind rows 它忽略了NULL价值观
  • 使用 R 选择第一个非 NA 值

    df lt data frame ID c 1 1 1 2 3 3 3 test c NA 5 5 6 4 NA 7 3 NA 10 9 我想创建一个名为 value 的变量 它是每个单独 ID 测试的第一个非 NA 值 对于只有NA的个体
  • 在 R 中使用 lapply 绘制多个数据帧

    我正在尝试使用 lapply 函数绘制多个数据帧 每个数据帧一个图 但是尽管有关此主题的所有帖子我都找不到答案 因为我不断收到错误 图的输出列表为空 我的数据结构如下 df1 lt mtcars gt group by cyl gt tal
  • ggplot2 geom_密度和geom_histogram在一个图中

    如何制作一个所有条形加起来为 1 的直方图 并在适合的上方添加一个密度层 set seed 1234 df lt data frame sex factor rep c F M each 200 weight round c rnorm 2
  • 更改闪亮 R 中的默认浏览器

    我在 RStudio 中使用 01 hello 虽然在 IE 中默认打开程序时它不会显示直方图 但即使在 Chrome 中 滑块也不起作用 我无法滑动条形图并看到直方图中的变化 如何更改 R 中的默认浏览器 以便闪亮启动 Chrome 而不

随机推荐

  • 载波;多个上传者还是只有一个?

    我有一个post模型和一个podcast模型 两种模型都有一个名为 image 我正在使用一个载波 https github com jnicklas carrierwaveuploader 名为 ImageUploader 来处理这两种模
  • 如何设置剪切矩形或区域

    如何设置 修改和清除 iOS drawRect 内的剪切矩形 以将线条 文本 图像等的通用 CG 绘图剪切到视图的一小部分 是否可以使用由一堆矩形和圆形组成的更复杂的剪切区域 您可以设置任意路径的剪切区域 不限于矩形 以下是一些实现方法 您
  • Gson 将新对象数组附加到现有 JSON 文件

    我需要一些帮助将新数组附加到现有文件中 我有一个像这样的 JSON 文件 name any address street xxxx number 1 email email protected cdn cgi l email protect
  • 暂停 VBA 循环,直到重新计算工作表

    我在 Google 上搜索到第 10 页 但找不到解决方案 我在 VBA 中有一个循环 但希望它在继续之前等待 直到重新计算工作表 大多数人建议的是雇佣DoEvents 但是 这对我不起作用 这是到目前为止我的代码 它不会等到工作表计算出来
  • 使用 Retrofit 2.0 POST 方法获取请求正文内容

    我需要在执行之前获取请求正文并使用 Retrofit 2 0 执行一些逻辑操作enque手术 但不幸的是 我无法从我的服务呼叫中获取帖子正文内容 目前 经过大量搜索后 我发现只有一种解决方案 例如logging the request我使用
  • 无法启动嵌入式Tomcat org.springframework.context.ApplicationContextException

    最近开始使用 Spring Boot 尝试创建一个简单的登录 以便我可以开始将我的 spring mvc 项目迁移到 spring boot 但是不断收到错误 无法启动网络服务器 嵌套异常是 org springframework boot
  • 如何覆盖 NumPy 的 ndarray 和我的类型之间的比较?

    在 NumPy 中 可以使用 array priority 属性来控制作用于 ndarray 和用户定义类型的二元运算符 例如 class Foo object def radd self lhs return 0 array priori
  • 单次迭代 => 从 Java 到 Scala 的多个输出集合

    我目前正在尝试将一些 Java 代码转换为 Scala 代码 挑战在于确保转换后的 Scala 代码与原始 Java 代码相比不会执行效率非常低的事情 例如当尝试转换以下代码时 class Person String name Intege
  • 关闭 viewController 后重新加载 tableView

    我有一个 ViewController VCA 里面有一个 TableView 从这个 ViewController 可以调用另一个 ViewController VCB 在第二个 VC 中 可以向 plist 添加一个项目 用于填充 VC
  • Twitter消费者密钥和秘密密钥有什么区别?

    我是 Twitter 开发新手 现在 我已经获得了消费者密钥和秘密密钥 但我不知道在哪里使用哪一个 用于登录的简单 JavaScript 代码不起作用 我其实想在推特上发布比赛的比分 任何人请指导我 谢谢 Twitter 有一个很棒的入门指
  • 为什么 readline() 将 stdin 回显到 stdout?

    我写了一个小的 C 程序 使用readline 从 stdin 读取输入 我没有从终端与其进行交互 而是编写了一个测试工具来执行 C 程序并为其提供输入 test harness stdout gt stdin gt C program s
  • 与 .Net 邮件附件一起使用时处置 MemoryStream

    我正在使用 MemoryStream 从存储在数据库中的二进制文件添加附件 我的问题是我想正确处置 MemoryStream 使用 using 语句可以轻松完成此操作 但是当我有多个附件时 我不知道如何正确处理多个 MemoryStream
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • Java BigInteger [重复]

    这个问题在这里已经有答案了 可能的重复 BigInteger 的困难 https stackoverflow com questions 10780209 diffucilty with biginteger import java mat
  • 为什么在内部类中使用公共方法?

    我们的一个项目中有很多代码如下所示 internal static class Extensions public static string AddFoo this string s if s null return Foo return
  • 如何将 Lua 嵌入到 Python 3.x 中?

    是否可以将 Lua 嵌入到 Python 3 x 中 如果是这样 我如何在我的 Python 程序中运行和执行 Lua 脚本 语言之间的交互有多好 例如 Lua 是否可以访问 Python 的所有变量和类以及 Python 是否可以访问 L
  • Angular 2/4 中的嵌套路由

    我正在开发一个应用程序 我打算具有以下结构 MAIN main container main routes NCF lazy loaded routes for it s subapps ACNP lazy loaded Component
  • 需要defaultReadObject()和defaultWriteObject()

    为什么需要写defaultReadObject and defaultWriteObject 作为第一个声明readObject ObjectInputStream o and writeObject ObjectOutputStream
  • 如何根据场景启用/禁用 html 按钮?

    我的网页上有一个带有以下代码的按钮 HTML
  • 使用 data.table 重新编码变量

    我正在尝试使用 data table 重新编码变量 我用谷歌搜索了近2个小时但找不到答案 假设我有一个 data table 如下 DT lt data table V1 c 0L 1L 2L V2 LETTERS 1 3 V4 1 12