【问题标题】:Create frequency data frame and transfer columns from old data frame创建频率数据框并从旧数据框传输列
【发布时间】:2021-01-03 20:12:08
【问题描述】:

我正在使用 map 函数从数据框列表中创建频率表。我想从原始数据框中导入名称列。例如,当我输入df_freq$C 时,我想看到三列,valuenname。对于name 列,我希望所有值都等于"C"

# load packages and define variables
rm(list  = ls())
library(purrr)
library(dplyr)

## load data
df_raw <- data.frame(name = c("C", "A", "B", "A", "B", "C"), 
                          start = c(2, 1, 3, 4, 5, 2),  
                          end = c(7, 6, 7, 8, 10, 9)) 

df <- df_raw %>%
  split(.$name) %>% # split data by name
  imap(function(x, x_name) {
    data.frame(value = Map(seq.int, x$start, x$end) %>% unlist,
               name = x_name) })

## create frequency plot with name column
df_freq <- df %>%
map(., ~count(.x, value))```

【问题讨论】:

    标签: r dataframe dplyr pipe purrr


    【解决方案1】:

    可以在tidyverse中更直接地完成。创建rowwise 属性,然后transmute 为每一行返回从“开始”到“结束”序列的namelistunnestlist 列并执行count

    library(dplyr)
    library(tidyr)
    df_raw %>% 
        rowwise %>% 
        transmute(name, value = list(start:end)) %>%
        unnest(c(value)) %>% 
        count(name, value)
    

    -输出

    # A tibble: 24 x 3
    #   name  value     n
    #   <chr> <int> <int>
    # 1 A         1     1
    # 2 A         2     1
    # 3 A         3     1
    # 4 A         4     2
    # 5 A         5     2
    # 6 A         6     2
    # 7 A         7     1
    # 8 A         8     1
    # 9 B         3     1
    #10 B         4     1
    # … with 14 more rows
    

    或者代替rowwise,可以使用map2

    library(purrr)
    df_raw %>%
        transmute(name, value = map2(start, end, `:`)) %>% 
        unnest(c(value)) %>%
        count(name, value)
    

    在 OP 的代码中,count 也需要 name

    df %>%
         map(., ~count(.x, name, value))
    

    【讨论】:

      【解决方案2】:

      这是一个data.table 选项

      setDT(df)[, .(value = unlist(Map(seq, start, end)), n = 1), .(name)][, .(n = sum(n)), by = .(name, value)]
      

      给了

          name value n
       1:    C     2 2
       2:    C     3 2
       3:    C     4 2
       4:    C     5 2
       5:    C     6 2
       6:    C     7 2
       7:    C     8 1
       8:    C     9 1
       9:    A     1 1
      10:    A     2 1
      11:    A     3 1
      12:    A     4 2
      13:    A     5 2
      14:    A     6 2
      15:    A     7 1
      16:    A     8 1
      17:    B     3 1
      18:    B     4 1
      19:    B     5 2
      20:    B     6 2
      21:    B     7 2
      22:    B     8 1
      23:    B     9 1
      24:    B    10 1
          name value n
      

      【讨论】:

        猜你喜欢
        • 2022-07-31
        • 2020-02-29
        • 1970-01-01
        • 2021-12-09
        • 1970-01-01
        • 2021-11-28
        • 2019-05-11
        • 2019-05-16
        • 2018-07-14
        相关资源
        最近更新 更多