【问题标题】:How to produce summary table?如何制作汇总表?
【发布时间】:2020-10-09 02:59:52
【问题描述】:

假设我有一个名为df 的表。

A; B
A; B
B; C; D
C; D; E; F

行中每个元素的权重计算为:wt[i] <- 1/lengths(str_split(df[1],";"))理想情况下,附于每个元素的上述表格权重如下所示。

0.5*A; 0.5*B
0.5*A; 0.5*B
0.333*B; 0.333*C; 0.333*D
0.25*C; 0.25*D; 0.25*E; 0.25*F

所以,我的意图是制作一个表格,其中频率是权重之和。我需要的输出如下:

A     B     C     D      E     F
1  1.333 0.583  0.583  0.25  0.25

非常感谢任何帮助!

【问题讨论】:

    标签: r stringr tm


    【解决方案1】:

    这是base R 中的一个选项。将第一列用; 后跟零个或多个空格(\\s*)拆分后,获取listlengths 并使用tapply 找到sum

    lst1 <- strsplit(df[[1]], ";\\s*")
    l1 <- lengths(lst1)
    tapply(rep(1/l1, l1), unlist(lst1), sum)
    #        A         B         C         D         E         F 
    #1.0000000 1.3333333 0.5833333 0.5833333 0.2500000 0.2500000 
    

    或者在tidyverse中,我们可以使用separate_rows拆分列,然后通过summarise进行分组

    library(tibble)
    library(dplyr)
    library(tidyr)
    df %>%
        mutate(rn = row_number()) %>%
        separate_rows(v1) %>%
        add_count(rn) %>% 
        mutate(n = 1/n) %>% 
        group_by(v1) %>% 
        summarise(n = sum(n))
    # A tibble: 6 x 2
    #  v1        n
    #  <chr> <dbl>
    #1 A     1    
    #2 B     1.33 
    #3 C     0.583
    #4 D     0.583
    #5 E     0.25 
    #6 F     0.25 
    

    数据

    df <- structure(list(v1 = c("A; B", "A; B", "B; C; D", "C; D; E; F"
    )), class = "data.frame", row.names = c(NA, -4L))
    

    【讨论】:

    • 第二个数据集是一种虚数。我真正拥有的只是第一个数据集。程序应自行计算、分配权重并生成表格。
    • @Gadaa 它给出了您帖子中的预期输出
    • 我还有一个问题要问你。 row.names = c(NA, -4L) 假定行名的长度为 4。但我希望每次迭代都应该改变这个长度(当然数据框也会改变),因为我将在 for 循环中使用。有可能这样做吗?
    • @Gadaa 如果您在谈论我帖子中的数据。它来自dput,即dput(head(iris)) 给出了这种格式。您能否将所需信息作为新问题发布,以便更清楚。谢谢
    猜你喜欢
    • 2017-08-19
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    相关资源
    最近更新 更多