我有以下结构化表格(例如):
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类中出现的百分比。
答案 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