基于唯一列交互的虚拟变量

时间:2017-02-16 16:20:20

标签: r

我有以下数据,并希望为两列之间的每个唯一交互创建一个$ID变量

DATE <- c('V', 'V', 'W', 'W', 'X', 'X', 'Y', 'Y', 'Z', 'Z')
SEX <- rep(1:2, 5)
Blood_T1 <- c(3,4,3,3,4,3,1,6,3,4)
Blood_T2 <- c(4,3,3,3,3,4,6,1,4,3)
df1 <- data.frame(DATE, SEX, Blood_T1, Blood_T2)

$DATE分组时,我想为$Blood_T1$Blood_T2的每个唯一组合创建一个新的虚拟变量,无论其顺序如何。

所需的输出显示如下:

enter image description here

我无法使用总和,因为它并不总是产生独特的组合。 (请参阅上面黄色标记的部分以获得说明

我已经尝试了以下命令,但尚未敲击头部

with(df1, interaction(Blood_T1, Blood_T2))
as.numeric(as.factor(with(df1, paste(Blood_T1, Blood_T2))))
transform(df1, Cluster_ID = as.numeric(interaction(Blood_T1, Blood_T2, drop=TRUE)))

2 个答案:

答案 0 :(得分:2)

您实际上可以将各个对($Blood_T1$Blood_T2)和paste组合在一起,这些对已经一种 ID

apply(df1, 1, function(x) paste(sort(x[3:4]), collapse = ""))
#[1] "34" "34" "33" "33" "34" "34" "16" "16" "34" "34"

如果您想进一步减少它,可以将其视为一个因素并获得数值

as.numeric(as.factor(apply(df1, 1, function(x) paste(sort(x[3:4]), collapse = ""))))
#[1] 3 3 2 2 3 3 1 1 3 3

如果有必要,你也可以投入DATE

apply(df1, 1, function(x) paste(sort(x[c(1,3:4)]), collapse = ""))
#[1] "34V" "34V" "33W" "33W" "34X" "34X" "16Y" "16Y" "34Z" "34Z"

答案 1 :(得分:1)

我们可以尝试使用data.table。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1)),获取&#39; Blood_T1&#39;的pminpmax和&#39; Blood_T2&#39;列{},pastematch值与unique元素一起创建&#39; Unique_ID&#39;,然后我们按&#39; DATE&#39;并连接&#39; Blood_T1&#39;的sum和&#39; Blood_T2&#39;创造&#39; Sum&#39;柱

library(data.table)
setDT(df1)[, Unique_ID := {
          i1 <- paste(pmin(Blood_T1, Blood_T2), pmax(Blood_T1, Blood_T2))
           match(i1, unique(i1))}]
df1[, Sum := c(sum(Blood_T1), sum(Blood_T2)), DATE][]
#     DATE SEX Blood_T1 Blood_T2 Unique_ID Sum
#1:    V   1        3        4         1   7
#2:    V   2        4        3         1   7
#3:    W   1        3        3         2   6
#4:    W   2        3        3         2   6
#5:    X   1        4        3         1   7
#6:    X   2        3        4         1   7
#7:    Y   1        1        6         3   7
#8:    Y   2        6        1         3   7
#9:    Z   1        3        4         1   7
#10:   Z   2        4        3         1   7

以上也可以用base R实现,即矢量化方法。

i1 <- with(df1, paste(pmin(Blood_T1, Blood_T2), pmax(Blood_T1, Blood_T2)))
df1$Unique_ID <- match(i1, unique(i1))