通过以下示例,我希望扫描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)
}
所需的输出是每行的适当值列表
答案 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)]