【问题标题】:dummy variable based on unique column interaction [duplicate]基于唯一列交互的虚拟变量
【发布时间】:2017-02-16 16:20:19
【问题描述】:

我有以下数据并希望为两列之间的每个唯一交互创建一个$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)))

【问题讨论】:

  • interaction 完全按照您说的去做。 真的是你想做的吗?

标签: r


【解决方案1】:

您实际上可以将单个对($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"

【讨论】:

    【解决方案2】:

    我们可以试试data.table。将'data.frame'转换为'data.table'(setDT(df1)),得到'Blood_T1'和'Blood_T2'列的pminpmaxpaste,它一起,match使用unique 元素的值来创建“Unique_ID”,然后我们按“DATE”分组并连接“Blood_T1”和“Blood_T2”的sum 以创建“Sum”列

    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))
    

    【讨论】:

    • 谢谢你,我想我需要尽快报名参加你的一门课程以达到你的向导知识。
    • @lukeg 谢谢你的评论。但是,我认为您可能指的是 Arun,data.table 开发人员(我不是)
    猜你喜欢
    • 2023-04-08
    • 2017-08-15
    • 2019-03-18
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    相关资源
    最近更新 更多