【问题标题】:How can I reshape a data.table or data.farme in R without adding up the frequencies?如何在不增加频率的情况下重塑 R 中的 data.table 或数据框?
【发布时间】:2014-01-31 23:51:37
【问题描述】:

我正在尝试将以下 data.table 重塑为列联表(不完全是因为我不想将频率作为值,我只想要 0 或 1):

Df:

ID          CC
990081899A  CC2
990081899A  CC115
990081899A  CC39
990081899A  CC39
990081899A  CC115
990002362D  CC2
990002362D  CC115
990002362D  CC115
990002362D  CC115
990002362D  CC6
990042716D  CC2

我尝试了以下两件事,但得到了相同的结果:

第一:

Contingency<-with(Df, table(ID,CC))
Diag6<- cbind(ID = rownames(Contingency), apply(Contingency, 2 , as.character))

第二个:

我在数据中添加了 value 列,例如 Value = 1: 东:

ID          CC  Value
990081899A  CC2 1
990081899A  CC115   1
990081899A  CC39    1
990081899A  CC39    1
990081899A  CC115   1
990002362D  CC2 1
990002362D  CC115   1
990002362D  CC115   1
990002362D  CC115   1
990002362D  CC6 1
990042716D  CC2 1

并尝试过:

Df<- data.table(dcast(Df,ID~CC,value.var="Value"),key="ID")

两个结果相同:

ID  CC115   CC2 CC39    CC6
990081899A  2   1   2   0
990002362D  3   1   0   1

这里我不想要频率,我只想要它是否存在值应该是 1,否则为 0:

ID       CC115  CC2 CC39    CC6
990081899A  1   1   1   0
990002362D  1   1   0   1

非常感谢任何建议。

【问题讨论】:

  • 快速解决方法可能只是用 1 替换 0 以外的值
  • 感谢 Ananta,这是最后一个选项,但我的数据太大,所以我避免了额外的代码行。

标签: r data.table reshape2 contingency


【解决方案1】:

只需使用table(DF) 即可为您提供布局。
然后您可以使用sign 将所有正值转换为1

     sign(table(DF))

                CC
    ID           CC115 CC2 CC39 CC6
      990002362D     1   1    0   1
      990042716D     0   1    0   0
      990081899A     1   1    1   0

【讨论】:

    【解决方案2】:

    我确信这已经在某个地方得到了回答,但是 table 应该能够做到这一点:

    with(unique(dat), table(ID,CC) )
    
    #            CC
    #ID           CC115 CC2 CC39 CC6
    #  990002362D     1   1    0   1
    #  990042716D     0   1    0   0
    #  990081899A     1   1    1   0
    

    你可以像这样包装上面的:

    as.data.frame.matrix(with(unique(dat), table(ID,CC) ))
    

    ...如果您更喜欢该输出。

    #           CC115 CC2 CC39 CC6
    #990002362D     1   1    0   1
    #990042716D     0   1    0   0
    #990081899A     1   1    1   0
    

    【讨论】:

      【解决方案3】:

      你可以通过将你自己的函数传递给dcast来做到这一点(有或没有data.table

      dcast(DF,  ID~CC, fun = function(x) as.integer(length(x)>0))
      # Using CC as value column: use value.var to override.
      #           ID CC115 CC2 CC39 CC6
      # 1 990002362D     1   1    0   1
      # 2 990042716D     0   1    0   0
      # 3 990081899A     1   1    1   0
      

      或者通过传递包含唯一组合的简化 data.frame

       dcast(unique(DF), ID~CC,fun=length,value.var = 'CC')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-04
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 2023-02-13
        • 2023-04-06
        • 2016-04-18
        • 1970-01-01
        相关资源
        最近更新 更多