我有以下数据,并希望为两列之间的每个唯一交互创建一个$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
的每个唯一组合创建一个新的虚拟变量,无论其顺序如何。
所需的输出显示如下:
我无法使用总和,因为它并不总是产生独特的组合。 (请参阅上面黄色标记的部分以获得说明)
我已经尝试了以下命令,但尚未敲击头部
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)))
答案 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;的pmin
和pmax
和&#39; Blood_T2&#39;列{},paste
,match
值与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))