r语言 - 有条件地替换数据帧中的所有值



我有一个数字数据帧,我试图将其中的每个值更改为字符串,然后按比例按该字符串总结它。

示例表:

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的答案(这是原始的)使用ifelsegroup_bysummarise:

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  

最新更新