在`dplyr`中计算频率列表
在`dplyr`中计算频率列表
对于熟悉dplyr的人来说,这可能是一个简单的问题 - 我想要在一个数据框中计算字符数据的频率列表:
玩具数据:
df <- data.frame(
id = sample(1:5, 100, replace = TRUE),
v1 = sample(c(NA, rnorm(10)), 100, replace = TRUE),
v2 = sample(LETTERS, 100, replace = TRUE)
)
到目前为止我的尝试:
假设df首先需要根据一些变量进行过滤。一旦完成,我就能够计算频率列表,但是输出结果没有显示相应的字符值,所以我不知道哪个值对应哪个频率:
library(dplyr)
df %>%
filter(!is.na(v1) & !id == lag(id)) %>%
summarise(freq = sort(prop.table(table(v2)), decreasing = TRUE)*100)
freq
1 7.692308
2 6.410256
3 5.128205
4 5.128205
5 5.128205
6 5.128205
7 5.128205
8 5.128205
9 5.128205
10 5.128205
输出被截断 ...
所以我需要得到的是第二列显示频率所属的值A, B, C等。如何实现这一点?
编辑:
哦,我想我明白了:
df %>%
filter(!is.na(v1) & !id == lag(id)) %>%
summarise(freq = sort(prop.table(table(v2)), decreasing = TRUE)*100,
value = names(sort(prop.table(table(v2)), decreasing = TRUE)))
在上述代码中,我们使用了`dplyr`包中的函数来计算频率列表。下面我们将解释问题的出现原因以及解决方法。
问题的出现原因:
这段代码的目的是计算数据框`df`中变量`v2`的频率列表。但是,在代码中有一行`!id == lag(id)`,这可能是出现问题的原因。
解决方法:
为了解决这个问题,我们可以对代码进行修改。我们可以将`!id == lag(id)`这一行改为`!is.na(id) & !id == lag(id)`,以确保过滤掉`id`变量的缺失值。
修改后的代码如下:
df %>% filter(!is.na(v1) & !is.na(id) & !id == lag(id)) %>% mutate(n_total = n()) %>% group_by(v2) %>% summarise(freq = n(), n_total = max(n_total)) %>% mutate(freq = 100*freq/n_total) %>% select(-n_total) %>% arrange(-freq)
修改后的代码将首先过滤掉`v1`和`id`变量的缺失值,然后计算每个`v2`值的频率,并计算总频率,最后按照频率的降序排列。
通过这个修改,我们可以确保代码能够正确计算频率列表。
问题:如何使用dplyr计算频率列表?
原因:该问题的出现是由于需要使用dplyr包中的函数计算给定数据框中某一列的频率列表。
解决方法:可以通过以下步骤使用dplyr包来计算频率列表:
1. 导入dplyr包:
library(dplyr)
2. 使用管道操作符`%>%`,将数据框传递给下一个函数:
df %>%
3. 使用`filter()`函数过滤数据框,排除包含NA值的行,并且id的值不能与前一行的id值相同:
filter(!is.na(v1) & id != lag(id)) %>%
4. 使用`count()`函数计算v2列的频率,并将结果命名为freq,按照频率进行排序:
count(v2, name = 'freq', sort = TRUE) %>%
5. 使用`mutate()`函数将频率转换为百分比:
mutate(freq = prop.table(freq) * 100)
最后,将结果打印输出。
整理成一篇文章如下:
使用dplyr包计算频率列表
====================
在R语言中,`dplyr`是一个非常流行的数据处理包。它提供了一种简洁、一致的语法,能够快速、高效地处理数据框。本文将介绍如何使用dplyr包来计算给定数据框中某一列的频率列表。
首先,我们需要导入dplyr包:
library(dplyr)
接下来,我们使用管道操作符`%>%`,将数据框传递给下一个函数:
df %>%
然后,我们使用`filter()`函数过滤数据框,排除包含NA值的行,并且id的值不能与前一行的id值相同:
filter(!is.na(v1) & id != lag(id)) %>%
接着,我们使用`count()`函数计算v2列的频率,并将结果命名为freq,按照频率进行排序:
count(v2, name = 'freq', sort = TRUE) %>%
最后,我们使用`mutate()`函数将频率转换为百分比:
mutate(freq = prop.table(freq) * 100)
完成以上步骤后,我们将得到计算出的频率列表。
# v2 freq #1 M 9.090909 #2 Q 7.792208 #3 K 6.493506 #4 R 6.493506 #5 T 6.493506 #6 B 5.194805 #7 C 5.194805 #8 F 5.194805 #9 I 5.194805 #10 U 5.194805 #11 G 3.896104 #12 J 3.896104 #13 S 3.896104 #14 V 3.896104 #15 W 3.896104 #16 A 2.597403 #17 N 2.597403 #18 X 2.597403 #19 D 1.298701 #20 E 1.298701 #21 H 1.298701 #22 L 1.298701 #23 O 1.298701 #24 P 1.298701 #25 Y 1.298701 #26 Z 1.298701
通过上述步骤,我们可以使用dplyr包很方便地计算出给定数据框中某一列的频率列表。