几个变量的出现频率

时间:2019-03-05 13:54:47

标签: r vector

我正在使用R。

我有一个看起来像这样的数据库:

Price A       Price B   
1              3           
3              2            
1              3            
2              4          
3              2           
3              2            
3              3           

我想做的是计算每对夫妇的出现次数(价格A,价格B),并知道哪对夫妇最突出(比方说三对突出),以及它们的出现频率。

我真的不知道该怎么做。

例如此处:

(3,2):3次

(1,3):2次

(2,4):1次

(3,3):1次

感谢您的帮助

马克

4 个答案:

答案 0 :(得分:1)

dplyr的可能性可能是:

df %>%
 group_by_all() %>%
 tally()

  Price_A Price_B     n
    <int>   <int> <int>
1       1       3     2
2       2       4     1
3       3       2     3
4       3       3     1

或与count()相同的结果:

df %>%
 count(Price_A, Price_B)

或者如果您希望将两列的组合作为一列:

df %>%
 mutate(Price_comb = paste(Price_A, Price_B, sep = ",")) %>%
 count(Price_comb) 

  Price_comb     n
  <chr>      <int>
1 1,3            2
2 2,4            1
3 3,2            3
4 3,3            1

答案 1 :(得分:1)

使用基数Rdf.new <- as.data.frame(with(df, table(Price.A, Price.B)))或@ {Ronak Shah指出的df.new <- as.data.frame(table(df))

# output df.new
  Price.A Price.B Freq
1       1       2    0
2       2       2    0
3       3       2    3
4       1       3    2
5       2       3    0
6       3       3    1
7       1       4    0
8       2       4    1
9       3       4    0

df.new[df.new$Freq != 0, ]
#   Price.A Price.B Freq
3       3       2    3
4       1       3    2
6       3       3    1
8       2       4    1

数据

df <- structure(list(Price.A = c(1L, 3L, 1L, 2L, 3L, 3L, 3L), Price.B = c(3L, 
2L, 3L, 4L, 2L, 2L, 3L)), .Names = c("Price.A", "Price.B"), class = "data.frame", row.names = c(NA, 
-7L))

答案 2 :(得分:0)

这可以通过SQL查询轻松完成,因此让我们尝试使用sqldf包:

library(sqldf)

sql <- "SELECT price_a, price_b, COUNT(*) AS frequency
        FROM your_df
        GROUP BY price_a, price_b
        ORDER BY frequency DESC"

result <- sqldf(sql)

enter image description here

Demo

答案 3 :(得分:0)

使用tidyverse的另一种summarise方法允许您指定新列的名称。

您的数据:

df <- structure(list(PriceA = c(1, 3, 1, 2, 3, 3, 3), PriceB = c(3, 
                                                             2, 3, 4, 2, 2, 3)), class = c("spec_tbl_df", "tbl_df", "tbl", 
                                                                                           "data.frame"), row.names = c(NA, -7L), spec = structure(list(
                                                                                             cols = list(PriceA = structure(list(), class = c("collector_double", 
                                                                                                                                              "collector")), PriceB = structure(list(), class = c("collector_double", 
                                                                                                                                                                                                  "collector"))), default = structure(list(), class = c("collector_guess", 
                                                                                                                                                                                                                                                        "collector")), skip = 2), class = "col_spec"))

解决方案:

library(tidyverse)
df %>% 
  group_by(PriceA, PriceB) %>% 
  summarise(Freq = n())

# A tibble: 4 x 3
# Groups:   PriceA [3]
  PriceA PriceB  Freq
   <dbl>  <dbl> <int>
1      1      3     2
2      2      4     1
3      3      2     3
4      3      3     1