【问题标题】:Create pairwise data frame from two columns从两列创建成对数据框
【发布时间】:2018-05-08 12:48:00
【问题描述】:

我有一些样本数据

df = data.frame("cus" = c("cus1", "cus1", "cus1", "cus1", "cus2", "cus2", "cus2", 
"cus3", "cus3"), "prod"=c("prod1", "prod2", "prod3", "prod4", "prod5", "prod1", 
"prod2", "prod3", "prod4"))

我想创建一个新的数据框,其中唯一的(df$cus)作为行名,唯一的(df$prod)作为列名。如果 cusX - prodX 组合在 df 中,则该值应为 1,否则为 0。 所需的输出如下所示:

     prod1 prod2 prod3 prod4 prod5
cus1     1     1     1     1     0
cus2     1     0     0     0     1
cus3     0     0     1     1     0

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    table 这样做:

    > table(df)
          prod
    cus    prod1 prod2 prod3 prod4 prod5
      cus1     1     1     1     1     0
      cus2     1     1     0     0     1
      cus3     0     0     1     1     0
    

    ……但它本身并不返回data.frame(而是返回一个table类的矩阵)。如果您确实需要data.frame,那么as.data.frame(table(df)) 可以,但可能不是您想要的:

    > as.data.frame(table(df))
          cus   prod  Freq
     1   cus1  prod1     1
     2   cus2  prod1     1
     3   cus3  prod1     0
     4   cus1  prod2     1
     …
    

    这是因为执行此转换通常更明智。为避免这样做,您需要取消设置表的class

    result = as.data.frame(unclass(table(df)))
    

    【讨论】:

    • 你可以这样做一步获取data.frame:as.data.frame.matrix(table(df))
    • @Pierre:没错,但通常不应该直接调用 S3 泛型。事实上,现在甚至不鼓励在编写包时导出它们。 base 在这方面使用过时的做法。
    猜你喜欢
    • 2020-06-17
    • 2020-10-08
    • 2018-08-31
    • 2016-05-22
    • 2022-08-11
    • 2020-06-14
    • 2021-12-17
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多