我有一个包含1.6x10^8记录的data.table,我想根据值为1的指示器列名称创建一个新的字符列。
例如
library(data.table)
DT <- data.table::data.table(ID=c("a","a","a","b","b"),
drugA=c(1,1,1,0,0),
drugB=c(0,1,1,1,0),
drugC=c(0,0,1,0,1))
ID drugA drugB drugC
1: a 1 0 0
2: a 1 1 0
3: a 1 1 1
4: b 0 1 0
5: b 0 0 1
### NOTE: I know the paste0(...,collapse) argument might be helpful in concatenating the drug names as an intermediate step
ID drugA drugB drugC exposure
1: a 1 0 0 drugA
2: a 1 1 0 drugA+drugB
3: a 1 1 1 drugA+drugB+drugC
4: b 0 1 0 drugB
5: b 0 0 1 drugC
我希望它尽可能的健壮和干净,并且只依赖于data.table语法和/或其他有用的包/函数(例如dcast);我想避免创建大量的用户定义函数,因为考虑到我的数据表的大小,运行这个函数需要非常长的时间。
我已经查看了其他帖子,但我无法找到与我的情况和所需输出相似的东西。
任何帮助将不胜感激。
library('data.table')
DT[, id := .I]
df <- melt(DT, id.vars = 'id', measure.vars = c("drugA", "drugB", "drugC"))
df[value == 1, expose := 'exposure']
df[value == 0, expose := 'no_exposure'][, value := NULL]
df <- dcast(df, id ~ expose, fun.aggregate = function(x) paste0(x, collapse = "+"), value.var = 'variable')
DT[df, on = 'id'][, id := NULL][]
# ID drugA drugB drugC exposure no_exposure
# 1: a 1 0 0 drugA drugB+drugC
# 2: a 1 1 0 drugA+drugB drugC
# 3: a 1 1 1 drugA+drugB+drugC
# 4: b 0 1 0 drugB drugA+drugC
# 5: b 0 0 1 drugC drugA+drugB
我们可以按行序列进行分组,指定 .SDcols
作为“药物”列,转换数据子集表 (.SD
) 逻辑
,使用它来子集列名并将它们粘贴
在一起
library(data.table)
DT[, exposure := paste(names(.SD)[as.logical(.SD)], collapse= '+'),
1:nrow(DT), .SDcols = drugA:drugC]
DT
# ID drugA drugB drugC exposure
#1: a 1 0 0 drugA
#2: a 1 1 0 drugA+drugB
#3: a 1 1 1 drugA+drugB+drugC
#4: b 0 1 0 drugB
#5: b 0 0 1 drugC
或者,我们可以循环访问列,将值更改为列名称,然后使用 do.call
粘贴
并使用 gsub
删除 NA
元素,而不是按行分组
DT[, exposure := gsub("NA\\+|\\+NA", "", do.call(paste,
c(Map(function(x, y) names(.SD)[(NA^!x) * y], .SD,
seq_along(.SD)), sep="+"))), .SDcols = drugA:drugC]
我有一个2010年和2019年的土地覆盖类型的数据框架。Pland代表总的土地覆盖价值,1等于该特定区域相对于ID的100%。这些计算是事先进行的,id代表每个几何形状。 我想执行一个函数,该函数生成另一个具有以下描述性名称的列,其中表示要替换的名称: 可复制代码:
我有一个如下所示的数据表 它有代表名称的p列和代表值的t列。t1是对应于p1、t2到p2等的值... 在每一行上,p列的值都是唯一的(或)。t列中的值也是如此。 我要做的是创建三个新列: ,每行所有t列的最小值(不包括NA) ,如果t_min存在(不是NA),则p列的对应值…因此,如果t2列具有t-min值,则列的对应值 ,具有p_min值的列的名称。因此,如果p_min值来自column,则“p
假设我有以下数据 现在我想向添加两个新列,分别命名为和,具有各自的值(1,2)。我可以使用循环来执行此操作,但我想以data.table的方式执行。 结果将是这样的: 到目前为止,我想出了类似这样的东西 其中< code>xx是一个< code > data . table -类似于< code >的命令。N,它寻址< code > by -组的值。 谢谢你的帮助! 附录:for-loop 方式
我有一个PySpark数据帧,它有几个字段,例如: 我想创建一个新列,将其他注释的值混合到一个新字符串中。期望的输出为: 我正在尝试做(伪代码): 如何实现这一点?
我有一个数据框如下所示 我想增加两列, 第一个名为“活动”的开关将值切换为1(如果为df.value 我尝试使用for循环,但当时间序列很长时,它会占用太多时间。有人知道更好的方法吗?谢谢你的进步!
本文向大家介绍MySQL创建带特殊字符的数据库名称方法示例,包括了MySQL创建带特殊字符的数据库名称方法示例的使用技巧和注意事项,需要的朋友参考一下 前言 这篇文章抓哟讲解了关于如何实现在MySQL中创建带有特殊字符的数据库名称,这里的特殊字符包含:!@#$%^ 方法如下 使用反引号`将数据库名称包含住,反引号`(使用引号是不可以的)即在英文输入法状态下,按Esc键对应下方的键即可出来。当然在没