r - R data.table - 将单个 ID 的多个组转换为多个列
问题描述
当dcast
ing 一个 data.table 时,如果一个 id 属于多个类别/字段,它length
默认返回的值。
dta <- (data.table(ID = c("A", "C", "B", "A", "D", "D", "A", "B", "D", "D"),
CATEGORY_DUPLICATE = c(LETTERS[17:23], LETTERS[20:22]),
CATEGORY_UNIQUE = c(LETTERS[17:23], c("T", "U.1", "V.1")),
VALUE = c(400, 400, 500, 300, 500, 100, 200, 300, 400, 500)))
dcast(dta, ID ~ CATEGORY_DUPLICATE, value.var = "VALUE")
ID Q R S T U V W
A 1 0 0 1 0 0 1
B 0 0 1 1 0 0 0
C 0 1 0 0 0 0 0
D 0 0 0 0 2 2 0
如果一个 id 对应的类别不超过一个,那么它只会返回实际值本身。我在示例表中添加了 1U
和V
列来演示这一点。
dcast(dta, ID ~ CATEGORY_UNIQUE, value.var = "VALUE")
ID Q R S T U U.1 V V.1 W
A 400 NA NA 300 NA NA NA NA 200
B NA NA 500 300 NA NA NA NA NA
C NA 400 NA NA NA NA NA NA NA
D NA NA NA NA 500 400 100 500 NA
我希望在dcast
查询本身中实现这个结果——这样一个 id 的多个组会生成多个列,其中包含实际值——而不是length
id 的类别。
请帮忙
解决方案
你也可以这样做:
dcast(dta[, CATEGORY_UNIQUE := make.unique(CATEGORY_DUPLICATE), by = ID],
ID ~ CATEGORY_UNIQUE, value.var = "VALUE")
ID Q R S T U U.1 V V.1 W
1: A 400 NA NA 300 NA NA NA NA 200
2: B NA NA 500 300 NA NA NA NA NA
3: C NA 400 NA NA NA NA NA NA NA
4: D NA NA NA NA 500 400 100 500 NA
推荐阅读
- java - 添加模块给了我一个解决依赖错误
- angular - 当我点击它时,mat-form-field 会中断
- javascript - 如何根据登录用户部门将现代 SharePoint 根站点重定向到不同的页面?
- javascript - Ngx 引导和输入文件元素
- javascript - 冻结 HTML 表格中的多个标题
- node.js - 如何在断开连接的 redhat linux 7.7 系统上构建 atom
- c# - 基于图像的gridview高度变化
- c - __forceinline 生成一个函数符号 - 为什么?如何让它不这样做?
- windows - 是否有 powershell 命令来选择具有特定字符串(时间)的行并且必须打印计数值 Total calls Generated:156?
- python - 我如何将所有循环变量存储在python字典中以在django中使用