在`dplyr`中计算频率列表

25 浏览
0 Comments

在`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)))

0
0 Comments

在上述代码中,我们使用了`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`值的频率,并计算总频率,最后按照频率的降序排列。

通过这个修改,我们可以确保代码能够正确计算频率列表。

0
0 Comments

问题:如何使用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包很方便地计算出给定数据框中某一列的频率列表。

0