【问题标题】:How to get frequencies of data using dplyr如何使用 dplyr 获取数据的频率
【发布时间】:2018-04-24 02:09:37
【问题描述】:

我有一个这样的data.frame:

# A tibble: 6 x 10
  freqtools freqtrees freqrt freqroamfriends freqroamalone freqparts freqmessy freqride freqall freqrain
      <int>     <int>  <int>           <int>         <int>     <int>     <int>    <int>   <int>    <int>
1         5         5      5               5             5         5         5        5       1        5
2         5         2      2               2             5         4         5        4       0        5
3         5         4      4               3             4         3         4        2       1        1
4         5         4      4               3             2         1         2        1       1        2
5         5         5      4               1             1         4         5        5       1        3
6         5         5      5               5             5         5         5        5       1        2

我想要一些可以回答问题的代码,最好使用 dplyr:

4 或 5 在多少行中至少出现一次?

然后是同样的问题,但“至少两次”和“至少三次”等等

并将其输出到带有标题“atleast1”“atleast2”等和比例的表格中。

EDIT ,按要求输出的 dput 示例:

structure(list(freqtools = c(5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), freqtrees = c(5L, 2L, 4L, 
4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 4L, 5L, 4L, 1L, 5L, 5L, 4L, 
4L, 4L, 5L, 4L, 5L, 5L, 5L, 5L, 3L, 5L, 5L, 5L, 5L, 5L), freqrt = c(5L, 
2L, 4L, 4L, 4L, 5L, 5L, NA, 3L, 5L, 5L, 5L, 4L, 5L, 3L, 2L, 5L, 
5L, 4L, 2L, 5L, 3L, 3L, 5L, 5L, 5L, 5L, 3L, 5L, 5L, 5L, 5L, 5L
), freqroamfriends = c(5L, 2L, 3L, 3L, 1L, 5L, 1L, 2L, 1L, 5L, 
5L, 5L, 1L, 3L, 3L, 1L, 4L, 5L, 4L, 1L, 3L, 3L, 2L, 3L, 5L, 5L, 
5L, 1L, 4L, 1L, 5L, 4L, 2L), freqroamalone = c(5L, 5L, 4L, 2L, 
1L, 5L, 1L, 2L, 1L, 5L, 5L, 5L, 1L, 1L, 2L, 1L, 2L, 5L, 3L, 1L, 
4L, 1L, 4L, 3L, 5L, 5L, 5L, 1L, 3L, 1L, 5L, 1L, 1L), freqparts = c(5L, 
4L, 3L, 1L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 1L, 5L, 3L, 2L, 5L, 
5L, 5L, 4L, 4L, 4L, 3L, 4L, 5L, 5L, 5L, 1L, 4L, 5L, 5L, 5L, 5L
), freqmessy = c(5L, 5L, 4L, 2L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 3L, 2L, 5L, 5L, 5L, 4L, 4L, 4L, 2L, 4L, NA, 5L, 5L, 
3L, 4L, 5L, 5L, 5L, 5L), freqride = c(5L, 4L, 2L, 1L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 3L, 4L, 5L, 5L, 4L, 4L, 4L, 4L, 
5L, 4L, 5L, 5L, 5L, 3L, 3L, 5L, 5L, 5L, 5L), freqall = c(1L, 
0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L
), freqrain = c(5L, 5L, 1L, 2L, 3L, 2L, 3L, 4L, 5L, 5L, 5L, 3L, 
4L, 4L, 3L, 3L, 2L, 5L, 4L, 5L, 4L, 4L, 2L, 4L, 5L, 5L, 4L, 3L, 
2L, 3L, 5L, 4L, 5L)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -33L), .Names = c("freqtools", "freqtrees", 
"freqrt", "freqroamfriends", "freqroamalone", "freqparts", "freqmessy", 
"freqride", "freqall", "freqrain"))

【问题讨论】:

  • 您能否发布dput(&lt;your data&gt;) 的结果以启用可重现的示例?
  • @tigerloveslobsters 完成,谢谢

标签: r dplyr


【解决方案1】:

1.创建一个计算频率的包装函数

library(dplyr)
freq <- function (...) {
  sample_data %>% count(...) %>% arrange(desc(n))
}

2.使用apply()将所有列发送到函数freq

a <- apply(X = sample_data,MARGIN = 2,freq)

3.使用for循环修改单个数据框(列表对象)

for (i in 1:length(a)) {
  a[[i]]$Column <- names(a[i])
  print(i)
  names(a[[i]]) <- c("Variable","n","Column_name")
}

4.使用do.call()绑定所有行

final <- do.call(rbind,a) %>% data.frame() %>% select(Column_name,Variable,n)

5.使用dplyr创建百分比

final %>% group_by(Column_name) %>% mutate(Percent=round(n/sum(n),4))

【讨论】:

  • 当我使用我的数据尝试第 1 步时,我收到错误:函数列表 [[i]](value) 中的错误:'...' 在不正确的上下文中使用
  • 确保将 sample_data 替换为您的数据并加载 dplyr 包。
  • 我已经这样做了,但错过了函数中的“sample_data”
【解决方案2】:

这是处理它的一种方法:

library(purrr) # map function
df %>%
  map(~ table(.x) %>% 
      prop.table() %>% 
      as_data_frame() %>% 
      spread(.x, n))

这会产生一个小标题列表,每个小标题包含每个值出现的行的比例。如果所有值都相同,您可能可以使用map_dfr 将它们组合成一个数据帧 - 我加载到内存中的数据集具有所有不同的值,所以我没有走那么远。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多