我想知道我们是否可以从下面的数据集中找到单一模式:
Name Food Decor Service Price
107 West 16 13 16 26
2nd Street cafe 14 13 15 21
44 & Hell's kitchen 22 19 19 42
55 wall 21 22 21 54
55 wall street 21 22 21 54
92 sub 15 15 15 43
Angelica kitchen 20 14 15 22
Angelo's 21 11 14 22
Avenue 18 14 14 36
我正在尝试使用which.max函数但无法获得所需的输出。 能帮忙吗?
例如 - 食物模式为21.
由于
答案 0 :(得分:1)
以下是您可重复格式的数据,省略了重复的行(55华尔街):
data1 <- structure(list(Name = c("107 West", "2nd Street cafe", "44 & Hell's kitchen",
"55 wall street", "92 sub", "Angelica kitchen",
"Angelos", "Avenue"),
Food = c(16L, 14L, 22L, 21L, 15L, 20L, 21L, 18L),
Decor = c(13L, 13L, 19L, 22L, 15L, 14L, 11L, 14L),
Service = c(16L, 15L, 19L, 21L, 15L, 15L, 14L, 14L),
Price = c(26L, 21L, 42L, 54L, 43L, 22L, 22L, 36L)),
.Names = c("Name", "Food", "Decor", "Service", "Price"),
class = "data.frame", row.names = c(NA, -8L))
我们可以使用tidyr::gather
然后dplyr
来计算每列中的值,然后过滤最大值。
library(dplyr)
library(tidyr)
data1 %>%
gather(key, value, -Name) %>%
group_by(key) %>%
count(value) %>%
filter(n == max(n)) %>%
ungroup()
key value n
<chr> <int> <int>
1 Decor 13 2
2 Decor 14 2
3 Food 21 2
4 Price 22 2
5 Service 15 3
如果您坚持使用丑陋的基础R解决方案,请参阅以下内容:
apply(data1[, 2:5], 2, function(x) names(table(x))[which(table(x) == max(table(x)))])
$Food
[1] "21"
$Decor
[1] "13" "14"
$Service
[1] "15"
$Price
[1] "22"
答案 1 :(得分:1)
您可以在没有额外库的情况下获得此功能。对于每个变量,您可以创建值的表并应用which.max来查找最常出现的值。如果出现平局,我会选择第一个。
使用@nielfws提供的数据
as.numeric(sapply(data1[,2:5], function(x) names(which.max(table(x)))[1]))
[1] 21 13 15 22
标记这些可能很好
Modes = as.numeric(sapply(data1[,2:5],
function(x) names(which.max(table(x)))[1]))
names(Modes) = colnames(data1[2:5])
Modes
Food Decor Service Price
21 13 15 22