每行数据框中出现最多次数的值

3
假设我有一个简单的数据框:
test_df <- data.frame(c(0,0,1,0,0,1,1,1,1,1),c(1,0,0,0,0,0,0,0,0,0))

我希望能够找出每一行中的最大数字(0或1)。例如,在我的例子中,第一个向量的最大值为1(有6次出现),第二个向量的最大值为0(有9次出现)。

我开始的代码如下:

> sapply(test_df,table)
  c.0..0..1..0..0..1..1..1..1..1. c.1..0..0..0..0..0..0..0..0..0.
0                               4                               9
1                               6                               1

到目前为止看起来很好。然后...
> sapply((sapply(test_df,table)),max)
[1] 4 6 9 1

我迷失了,我丢失了联想?1 -> 6,0 -> 9 我想要返回一个“获胜者”的向量:1,0,...

1 for the first vector (6 occurrences)
0 for the second vector (9 occurrences)
...

当您创建一个没有任何列名的data.frame时,您将得到c.0..0..1..0..0..1..1..1..1..1作为列名。请检查您创建的“test_df”的输出。 - akrun
2个回答

2

我们可以使用MARGIN=1apply函数来从sapply的每一行中提取max值。

frqCol <- sapply(test_df, table)
apply(frqCol, 1, max)
# 0 1 
# 9 6 

或者使用来自matrixStats的rowMaxs。
library(matrixStats)
rowMaxs(frqCol)
#[1] 9 6

如果我们需要每列的最大值
apply(frqCol, 2, max)

并且
colMaxs(frqCol)

有了这个新的例子

test_df <- data.frame(v1= c(0,0,1,0,0,1,1,1,1,1),
                  v2= c(1,0,0,0,0,0,0,0,0,0),
                  v3= c(1,0,0,0,0,0,0,0,0,1)) 
frqCol <- sapply(test_df, table)
apply(frqCol, 2, max)
#v1 v2 v3 
#6  9  8 
colMaxs(frqCol)
#[1] 6 9 8

sapply + apply看起来非常接近,但如果我向数据框添加另一个向量,该如何使用apply?test_df <- data.frame(c(0,0,1,0,0,1,1,1,1,1),c(1,0,0,0,0,0,0,0,0,0),c(1,0,0,0,0,0,0,0,0,1)) - user869097
@user869097 请你能否在你的帖子中更新这个内容。从评论中复制/粘贴太麻烦了。还请更新预期输出结果。 - akrun
@user869097 更新了帖子 - akrun
那么这个代码可不是很高效啊:do.call(pmax, data.frame(t(frqCol))) ;) - G. Cocca
@G.Cocca 是的,它可以使用,但我们需要将其转换为 data.frame。 - akrun

2

这可以在一个apply语句中完成。但是,不清楚您是想要每行还是每列的最大出现次数,因此以下两种情况(使用@akrun的更干净的数据集)都给出了返回一个向量来显示每行/列的“赢家”(1或0)。

## Data
test_df <- data.frame(v1= c(0,0,1,0,0,1,1,1,1,1),
                      v2= c(1,0,0,0,0,0,0,0,0,0),
                      v3= c(1,0,0,0,0,0,0,0,0,1)) 
#    v1 v2 v3
# 1   0  1  1
# 2   0  0  0
# 3   1  0  0
# 4   0  0  0
# 5   0  0  0
# 6   1  0  0
# 7   1  0  0
# 8   1  0  0
# 9   1  0  0
# 10  1  0  1

## Solution - For each row
apply(test_df, 1, function(x) { sum(sum(x == 1) > sum(x == 0)) })

## Result
# [1] 1 0 0 0 0 0 0 0 0 1

## Solution - For each column
apply(test_df, 2, function(x) { sum(sum(x == 1) > sum(x == 0)) })

## Result 
# v1 v2 v3 
# 1  0  0 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接