如何制作汇总表?
Posted
技术标签:
【中文标题】如何制作汇总表?【英文标题】: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
非常感谢任何帮助!
【问题讨论】:
【参考方案1】:这是base R
中的一个选项。将第一列用;
后跟零个或多个空格(\\s*
)拆分后,获取list
的lengths
并使用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))
给出了这种格式。您能否将所需信息作为新问题发布,以便更清楚。谢谢以上是关于如何制作汇总表?的主要内容,如果未能解决你的问题,请参考以下文章