【问题标题】:Count number of unique instances in a column depending on values in other columns根据其他列中的值计算列中唯一实例的数量
【发布时间】:2018-01-30 03:04:05
【问题描述】:

我有下表(称为火车)(实际上要大得多)

 UNSPSC adaptor alert bact blood collection packet patient ultrasoft whit
 514415       0     0    0     0          0      0       0         1    0
 514415       0     0    0     1          0      0       0         1    0
 514415       0     0    1     0          0      0       0         1    0
 514415       0     0    0     0          0      0       0         1    0
 514415       0     0    0     0          0      0       0         1    0
 514415       0     0    0     0          0      0       0         1    0
 422018       0     0    0     0          0      0       0         1    0
 422018       0     0    0     0          0      0       0         1    0
 422018       0     0    0     1          0      0       0         1    0
 411011       0     0    0     0          0      0       0         1    0

我想计算每列唯一 UNSPSC 的数量,其中值等于 1。因此对于列血,它将是 2,对于超软列,将是 3。

我正在这样做,但不知道如何继续:

apply(train[,-1], 2, ......)

我试图不使用循环。

【问题讨论】:

标签: r count distinct apply


【解决方案1】:

要从您离开的地方继续,我们可以将applymargin=2 结合使用,并计算每列的“UNSPSC”值的lengthunique

apply(train[-1], 2, function(x) length(unique(train$UNSPSC[x==1])))

#adaptor      alert       bact      blood collection     packet 
#     0          0          1          2          0          0 
#patient  ultrasoft       whit 
#     0          3          0 

更好的选择是使用sapply/lapply,它给出了相同的结果,但与apply 不同的是,它不会将数据帧转换为矩阵。

sapply(train[-1], function(x) length(unique(train$UNSPSC[x==1])))

【讨论】:

    【解决方案2】:

    如果您只有 0 和 1 列,如示例中所示,只需使用 colSums:

    colSums(train[,-1]) # 在使用前删除非数字列,如 UNSPSC

    # adaptor      alert       bact      blood collection     packet    patient 
    #         0          0          1          2          0          0          0 
    # ultrasoft       whit
    #        10          0
    

    【讨论】:

    • 您需要按UNSPSC 计数,而不是删除它 - 这不是正确答案
    • 对于列的总和,您应该删除它,否则它是荒谬的。请在使用简单和错误的评论忽略正确答案之前检查它。可以看到我的输出和上一个完全一样,r表达式更简洁简洁
    • "因此,对于列血,它将是 2,对于列超软,将是 3。" - 正如 OP 所要求的那样。你的答案不一样 - 你有 10 个用于超软。
    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2020-10-09
    • 2017-07-30
    • 1970-01-01
    相关资源
    最近更新 更多