我有一个数字数据帧,我试图将其中的每个值更改为字符串,然后按比例按该字符串总结它。
示例表:
var1 var2 var3 var4
2 3 5 8
3 6 8 7
5 3 7 4
如果一个数字小于4,我想用"no"如果一个数字大于或等于4,我想用"yes">
然后我想总结一下"是"的比例。和";no">
我试过使用dplyr,它似乎很容易做一个单列,但我有麻烦在所有列中应用它。我试过这样的方法,但没有成功。
df %>%
select(var1:var4) %>%
mutate_each(funs(replace(., . < 4, "no")) %>%
mutate_each(funs(replace., . => 4, "yes")) %>%
summarise(count = n())
谢谢你的帮助。
library(tidyverse)
df <- data.frame(
var1 = c(2L, 3L, 5L),
var2 = c(3L, 6L, 3L),
var3 = c(5L, 8L, 7L),
var4 = c(8L, 7L, 4L)
)
df %>%
mutate(across(.fns = ~ . >= 4)) %>%
summarise(across(.fns = ~ sum(.)/length(.) ))
#> var1 var2 var3 var4
#> 1 0.3333333 0.3333333 1 1
我们可以循环across
列,将值转换为'no', 'yes',用pivot_longer
重塑为'long'格式,得到count
,按'name'分组后除以计数的sum
,返回比例
library(dplyr)
library(tidyr)
df %>%
mutate(across(everything(),
~ case_when(. < 4 ~ 'no', TRUE ~ 'yes'))) %>%
pivot_longer(everything()) %>%
count(name, value) %>%
group_by(name) %>%
mutate(prop = 100 * n/sum(n)) %>%
ungroup
与产出
# A tibble: 6 x 4
name value n prop
<chr> <chr> <int> <dbl>
1 var1 no 2 66.7
2 var1 yes 1 33.3
3 var2 no 2 66.7
4 var2 yes 1 33.3
5 var3 yes 3 100
6 var4 yes 3 100
或者使用base R
100 * proportions(table(names(df)[col(df)], c('no', 'yes')[(df >= 4) + 1]), 1)
no yes
var1 66.66667 33.33333
var2 66.66667 33.33333
var3 0.00000 100.00000
var4 0.00000 100.00000
数据df <- structure(list(var1 = c(2L, 3L, 5L), var2 = c(3L, 6L, 3L), var3 = c(5L,
8L, 7L), var4 = c(8L, 7L, 4L)), class = "data.frame", row.names = c(NA,
-3L))
这是一个类似于akrun的答案(这是原始的)使用ifelse
和group_by
和summarise
:
df %>%
mutate(across(var1:var4, ~ifelse(. < 4, 'no', 'yes'))) %>%
pivot_longer(
cols = starts_with("var")) %>%
group_by(name, value) %>%
summarise(count = n()) %>%
mutate(prop = count/sum(count)*100)
输出:
name value count prop
<chr> <chr> <int> <dbl>
1 var1 no 2 66.7
2 var1 yes 1 33.3
3 var2 no 2 66.7
4 var2 yes 1 33.3
5 var3 yes 3 100
6 var4 yes 3 100