【问题标题】:Number of response patterns present in a matrix矩阵中存在的响应模式数
【发布时间】:2012-04-26 10:19:34
【问题描述】:

如何在 R 中的矩阵中为所有变量获取实际响应模式的数量?例如,我有一个由 3 个变量 a、b、c 和三个观察值组成的数据集。

a<-c(0,1,0)
b<-c(1,0,1)
c<-c(1,0,1)
d<-cbind(a,b,c)

产生矩阵

d

如果我没记错的话,它有两种响应模式:0,1,1 出现在两个观察中,1,0,0 出现在一个观察中。是否有一个函数可以告诉我是否需要在更大的数据集中进行计算?

谢谢

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    另一种可能性是使用duplicated()。这将只获得独特响应模式的数量,而不是它们是什么。

    length( which( !duplicated(d) ) )
    
    # [1] 2
    

    这看起来比使用apply() 和/或table() 快​​得多。

    【讨论】:

    • @MarcoM,我认为这条评论是为了不同的答案:)
    【解决方案2】:

    什么,还没有ddply 解决方案吗?你们plyr的粉丝越来越慢了……

    > library(plyr)
    > d <- as.data.frame(d)
    > ddply(d, ~a+b+c, summarize, n=length(c))
      a b c n
    1 0 1 1 2
    2 1 0 0 1
    

    也可以使用paste 创建公式,以减少键入次数:

    f <- paste("~", paste(names(d), collapse="+"))
    ddply(d, as.formula(f), summarize, n=length(c))
    

    【讨论】:

    • plyr 也很整齐。谢谢亚伦。我喜欢它在顶部报告变量的事实,您可以创建一个非常清晰的热图!假设您有一个非常长的矩阵,其中包含数百个名称不同且复杂的变量,您将如何告诉 ddply 哪些是您的变量而不必列出它们?也许像连接所有变量的字符向量之类的东西?手动操作可能会有些耗时,或者您必须求助于 Excel。如何创建 a+b+c 位而不需要指定变量的名称?
    【解决方案3】:

    你可以试试:

    table(apply(d, 1, paste, collapse=""))
    

    【讨论】:

    • 很好,虽然我建议用一个很少使用的字符折叠(merge 使用 \b),因为两个不同的组合可能会折叠成同一个东西(例如,@ 987654324@ 和 12,1.)
    【解决方案4】:

    主题的变化,允许选择感兴趣的列。

    d<-data.frame(d)
    d$combined<-with(d, paste(a,b,c))
    table(d$combined)
    
    0 1 1 1 0 0 
        2     1
    
    data.frame(table(d$combined))
    
    Var1 Freq
    1 0 1 1    2
    2 1 0 0    1
    

    有关提示,请参阅count unique values in R

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 2018-04-20
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多