R 用于在频率>3时打印频率表的循环

R 用于在频率>3时打印频率表的循环,r,for-loop,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) } 所需的输出是每行的适当值列表,

在下面的示例中,我希望扫描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)
}
所需的输出是每行的适当值列表,您可以执行以下操作:

apply(B, 1, function(x) as.numeric(names(table(x)[which(table(x) > 3)])))
或者,根据拖延症患者Maximus的评论,一个简短的版本:

apply(B, 1, function(x) as.integer(names(which(table(x) > 3))))
你可以做:

apply(B, 1, function(x) as.numeric(names(table(x)[which(table(x) > 3)])))
或者,根据拖延症患者Maximus的评论,一个简短的版本:

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

这并没有将其保留在每一行中,但可能值得研究matrixStats使用的包


这并没有将其保留在每一行中,但可能值得研究matrixStats使用的包

这里有一个使用data.table的选项。使用“data.table”转换为“long”格式的melt,转换为“data.table”setDT…,按“Var1”、“value”分组,只有当计数大于3时,我们才能获得频率计数

library(data.table)
setDT(melt(B))[, if(.N > 3) .N, .(Var1, value)]
这里有一个使用data.table的选项。使用“data.table”转换为“long”格式的melt,转换为“data.table”setDT…,按“Var1”、“value”分组,只有当计数大于3时,我们才能获得频率计数

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

示例更改了,所以可以找到更一致的答案示例更改了,所以可以找到更一致的答案您在这里并不真正需要。您可以使用applyB,1,functionx作为。numericnamestablex>3我不同意,names将选择所有名称,而不管T/F状态如何。我们必须只选择那些符合条件的。例如:as.numericnamestablec1,1,1,1,2,2>3在应该返回1的时候返回1和2。我被纠正了。我被相同的lapplyb,1,functionx as.numericnamestablex>3,applyB,1,functionx as.numericnamestablex[whichtablex>3]误导了:applyB,1,functionx as.integernameswhichtablex>3这里实际上不需要它。您可以使用applyB,1,functionx作为。numericnamestablex>3我不同意,names将选择所有名称,而不管T/F状态如何。我们必须只选择那些符合条件的。例如:as.numericnamestablec1,1,1,1,2,2>3在应该返回1的时候返回1和2。我被纠正了。我被相同的lapplyb,1,functionx作为.numericnamestablex>3,applyB,1,functionx作为.numericnamestablex[whichtablex>3]误导了:applyB,1,functionx作为.integernameswhichtablex>3