查找数据的单一模式

时间:2017-09-26 00:09:03

标签: r

我想知道我们是否可以从下面的数据集中找到单一模式:

  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.

由于

2 个答案:

答案 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