当freq> for循环打印频率表时3

时间:2016-12-23 08:55:03

标签: r for-loop

通过以下示例,我希望扫描B的每一行,如果它们出现的次数超过三次,则只扫描值 。我已尝试使用以下for循环,但尚未成功。

set.seed(123456)

B = matrix( sample(1:100, 100, replace = T), 
            nrow=10,
            ncol=10)

for(i=1:nrow(B)){
  which(table(B[i,])>3){
    NA
  }
  print(i)
}

所需的输出是每行的适当值列表

3 个答案:

答案 0 :(得分:4)

你可以这样做:

apply(B, 1, function(x) as.numeric(names(table(x)[which(table(x) > 3)])))

或根据ProcrastinatusMaximus的评论,更短的版本:

apply(B, 1, function(x) as.integer(names(which(table(x) > 3))))

答案 1 :(得分:1)

这不会在每行中保留,但可能值得查看使用的包([1, 2, 2, 1, 2] [1, 1, 2] [2]

matrixStats

答案 2 :(得分:1)

以下是使用data.table的选项。使用'data.table'中的melt转换为'long'格式,转换为'data.table'(setDT(...)),按'Var1','value'分组,我们只获得频率计数if计数大于3。

library(data.table)
setDT(melt(B))[, if(.N > 3) .N, .(Var1, value)]