根据另一个

时间:2017-04-08 11:17:29

标签: r

我有以下结构化表格(例如):

   Class 1    Class 2
1   1           1
2   1           1
3   1           1
4   1           2
5   3           3
6   3           3
7   3           4
8   4           4

我想计算给定1级中相同值出现在Class 2中的次数,并将其显示为百分比值。还要分组1级。所以我希望结果是这样的:

 Class 1     n_class1    Percentage of occurrence in class 2 
1   1           4                  0.75
2   3           3                  0.666
3   4           1                  1.0

我已经阅读了很多关于dplyr包的内容,并认为解决方案可以在那里,并且还查看了许多示例但尚未找到解决方案。我是编程的新手,所以没有自然程序员思考,希望有人可以给我如何做到的提示。

我已经设法通过使用group by获得n_class1但是努力获得第2类中出现的百分比。

2 个答案:

答案 0 :(得分:3)

您可以通过使用in.class1

创建新列mutate来实现此目的
library(dplyr)
df <- data.frame(
    class1 = rep(c(1, 3, 4), c(4, 3, 1)),
    class2 = rep(c(1, 2, 3, 4), c(3, 1, 2, 2))
)

df %>%
    mutate(in.class1 = class2 == class1) %>%
    group_by(class1) %>%
    summarise(n_class1 = n(),
              class2_percentile = sum(in.class1) / n()
    )

# # A tibble: 3 × 3
#   class1 n_class1 class2_percentile
#    <dbl>    <int>             <dbl>
# 1      1        4         0.7500000
# 2      3        3         0.6666667
# 3      4        1         1.0000000

正如Jaap在评论中所建议的那样,这可以简化为:

df %>%
    group_by(class1) %>%
    summarise(
        n_class1 = n(),
        class2_percentile = sum(class1 == class2) / n())

答案 1 :(得分:1)

问题已经被提出作为OP a larger question的一部分,之前已经询问了使用data.table回答的问题。

读取数据

library(data.table)
cl <- fread(
  "id   Class1    Class2
  1   1           1
  2   1           1
  3   1           1
  4   1           2
  5   3           3
  6   3           3
  7   3           4
  8   4           4"
)

聚合

cl[, .(.N, share_of_occurence_in_Class2 = sum(Class1 == Class2)/.N), by = Class1]
#   Class1 N share_of_occurence_in_Class2
#1:      1 4                    0.7500000
#2:      3 3                    0.6666667
#3:      4 1                    1.0000000