R: dplyr 可以按组计算百分比吗?
R: can dplyr calculate percents by group?
我正在使用 R 中的 dplyr 库。
我创建了以下数据集:
library(dplyr)
#create data
a = rnorm(100,100,10)
b = rnorm(100,100,10)
group <- sample( LETTERS[1:4], 100, replace=TRUE, prob=c(0.5, 0.2, 0.15, 0.15) )
#create frame
train_data = data.frame(a,b,group)
train_data$group = as.factor(train_data$group)
从这里开始,我想创建一个名为“diff”的新变量,用于记录变量“b”是否大于变量“a”:
train_data$diff = ifelse(train_data$b > train_data$a,1,0)
现在,我想在“train_data”table 中创建一个新变量(“perc”),它计算:
- 对于每个独特的组
- “差异”变量的“百分比”
例如
- 假设有 20 行“group = a”。
- 在这 20 行中,有 10 行变量“diff”为“1”。
- 因此,“perc”= 0.5 (10/20 = 0.5)。所以,对于这 20 行,“perc”的值应该是 0.5
使用另一个 Whosebug post,() 我试图实现这个:
final_table = data.frame(train_data %>% group_by(group) %>% mutate(perc = diff/max(diff)))
但这并没有给我想要的输出:
head(final_table)
a b group diff perc
1 107.19028 117.37028 D 1 1
2 105.34165 87.96513 A 0 0
3 120.21911 94.30301 C 0 0
4 98.06001 104.82173 D 1 1
5 104.54841 90.00205 B 0 0
6 90.77172 79.31384 D 0 0
7 96.22783 88.60185 D 0 0
8 113.67500 87.28380 B 0 0
9 96.82708 89.51343 C 0 0
10 115.38720 100.79550 C 0 0
11 105.30922 80.55969 C 0 0
12 114.93315 95.78172 B 0 0
13 105.20058 109.66729 C 1 1
例如,第11行和第13行都有“group = c”,但“perc”变量的值不同。此外,这里似乎没有计算百分比。
有人可以告诉我如何解决这个问题吗?
注意:是否也可以创建一个包含 4 行的 table 来提供摘要?我认为 Count = n()
命令可以用于此?
例如
Group Number of Rows Perc
a 20 0.6
b 20 0.7
c 50 0.9
d 10 0.24
或一般性总结(即在整个 table 中,“diff”变量为 1 的行的百分比是多少?):
d = sum(train_data$diff) / count(train_data$diff)
谢谢
如果我误解了你的问题,请告诉我:
library(dplyr)
#create data
a = rnorm(100,100,10)
b = rnorm(100,100,10)
group <- sample( LETTERS[1:4], 100, replace=TRUE, prob=c(0.5, 0.2, 0.15, 0.15) )
#create frame
train_data = data.frame(a,b,group)
# Question 1
train_data %>%
group_by(group) %>%
mutate(
percent = sum(a>b)/n()
)
#> # A tibble: 100 x 4
#> # Groups: group [4]
#> a b group percent
#> <dbl> <dbl> <chr> <dbl>
#> 1 95.0 88.9 B 0.429
#> 2 96.4 95.1 A 0.35
#> 3 102. 110. A 0.35
#> 4 97.4 96.2 A 0.35
#> 5 90.7 92.7 A 0.35
#> 6 92.0 105. B 0.429
#> 7 93.8 85.1 A 0.35
#> 8 101. 102. B 0.429
#> 9 92.0 99.1 A 0.35
#> 10 77.6 87.8 B 0.429
#> # ... with 90 more rows
# Question 2
train_data %>%
group_by(group) %>%
summarize(
rows= n(),
percent = sum(a>b)/n()
)
#> # A tibble: 4 x 3
#> group rows percent
#> <chr> <int> <dbl>
#> 1 A 60 0.35
#> 2 B 21 0.429
#> 3 C 8 0.375
#> 4 D 11 0.364
由 reprex package (v2.0.0)
创建于 2021-07-02
我正在使用 R 中的 dplyr 库。
我创建了以下数据集:
library(dplyr)
#create data
a = rnorm(100,100,10)
b = rnorm(100,100,10)
group <- sample( LETTERS[1:4], 100, replace=TRUE, prob=c(0.5, 0.2, 0.15, 0.15) )
#create frame
train_data = data.frame(a,b,group)
train_data$group = as.factor(train_data$group)
从这里开始,我想创建一个名为“diff”的新变量,用于记录变量“b”是否大于变量“a”:
train_data$diff = ifelse(train_data$b > train_data$a,1,0)
现在,我想在“train_data”table 中创建一个新变量(“perc”),它计算:
- 对于每个独特的组
- “差异”变量的“百分比”
例如
- 假设有 20 行“group = a”。
- 在这 20 行中,有 10 行变量“diff”为“1”。
- 因此,“perc”= 0.5 (10/20 = 0.5)。所以,对于这 20 行,“perc”的值应该是 0.5
使用另一个 Whosebug post,(
final_table = data.frame(train_data %>% group_by(group) %>% mutate(perc = diff/max(diff)))
但这并没有给我想要的输出:
head(final_table)
a b group diff perc
1 107.19028 117.37028 D 1 1
2 105.34165 87.96513 A 0 0
3 120.21911 94.30301 C 0 0
4 98.06001 104.82173 D 1 1
5 104.54841 90.00205 B 0 0
6 90.77172 79.31384 D 0 0
7 96.22783 88.60185 D 0 0
8 113.67500 87.28380 B 0 0
9 96.82708 89.51343 C 0 0
10 115.38720 100.79550 C 0 0
11 105.30922 80.55969 C 0 0
12 114.93315 95.78172 B 0 0
13 105.20058 109.66729 C 1 1
例如,第11行和第13行都有“group = c”,但“perc”变量的值不同。此外,这里似乎没有计算百分比。
有人可以告诉我如何解决这个问题吗?
注意:是否也可以创建一个包含 4 行的 table 来提供摘要?我认为 Count = n()
命令可以用于此?
例如
Group Number of Rows Perc
a 20 0.6
b 20 0.7
c 50 0.9
d 10 0.24
或一般性总结(即在整个 table 中,“diff”变量为 1 的行的百分比是多少?):
d = sum(train_data$diff) / count(train_data$diff)
谢谢
如果我误解了你的问题,请告诉我:
library(dplyr)
#create data
a = rnorm(100,100,10)
b = rnorm(100,100,10)
group <- sample( LETTERS[1:4], 100, replace=TRUE, prob=c(0.5, 0.2, 0.15, 0.15) )
#create frame
train_data = data.frame(a,b,group)
# Question 1
train_data %>%
group_by(group) %>%
mutate(
percent = sum(a>b)/n()
)
#> # A tibble: 100 x 4
#> # Groups: group [4]
#> a b group percent
#> <dbl> <dbl> <chr> <dbl>
#> 1 95.0 88.9 B 0.429
#> 2 96.4 95.1 A 0.35
#> 3 102. 110. A 0.35
#> 4 97.4 96.2 A 0.35
#> 5 90.7 92.7 A 0.35
#> 6 92.0 105. B 0.429
#> 7 93.8 85.1 A 0.35
#> 8 101. 102. B 0.429
#> 9 92.0 99.1 A 0.35
#> 10 77.6 87.8 B 0.429
#> # ... with 90 more rows
# Question 2
train_data %>%
group_by(group) %>%
summarize(
rows= n(),
percent = sum(a>b)/n()
)
#> # A tibble: 4 x 3
#> group rows percent
#> <chr> <int> <dbl>
#> 1 A 60 0.35
#> 2 B 21 0.429
#> 3 C 8 0.375
#> 4 D 11 0.364
由 reprex package (v2.0.0)
创建于 2021-07-02