使用如下数据框:
set.seed(100)
df <- data.frame(id = sample(1:5, 6, replace = TRUE),
prop1 = rep(c("A", "B"), 3),
prop2 = sample(c(TRUE, FALSE), 6, replace = TRUE),
prop3=sample(3:6, 6, replace = TRUE))
> df
id prop1 prop2 prop3
1 2 A FALSE 4
2 2 B TRUE 4
3 3 A FALSE 6
4 1 B TRUE 5
5 3 A FALSE 3
6 3 B FALSE 4
我需要通过id
进行聚合,以便对于每个col prop1
到propN
,生成直方图数据,如下所示。
对于每个id
,
prop1
需要捕获具有相同"A"
的所有记录的离散值数量的比率 - "B"
s,id
s,可通过名称访问像prop1[["A"]]
&amp; prop1[["B"]]
prop2
需要捕获具有相同"TRUE"
的所有记录的离散值数量的比率 - "FALSE"
s,id
s,可通过名称访问像prop1[["TRUE"]]
&amp; prop1[["FALSE"]]
prop3
需要捕获具有相同"3, 4, 5, 6"
的所有记录的离散值数量id
的比率,可通过prop1[["3"]]
等名称访问prop1[["4"]]
{1}},prop1[["5"]]
,prop1[["6"]]
如何使用以上格式完成prop1
到propN
的聚合 - 使用基础R
更新:添加输出表示。
我不确定正确的数据类型来表示输出中的输出和各种组件。但是,输出的电子表格视图如下。实际上,所需的输出形式使得它可以用作id
分布的查找表,以便进一步计算。
答案 0 :(得分:2)
这是一个使用如下定义的自定义函数的想法:
它根据id
拆分数据框,并应用公式(prop.table(table(...))
)来查找比率。 n
充当索引,以便确定您需要比率的列。例如,如果n
为2,那么fun1
将为列表中的每个元素应用找到第2列的比率的公式(对每个id
有效)。最后,我们通过循环遍历2:ncol(df)
(因此在您的情况下为2:4)来应用函数,以获得每个id的所有感兴趣列的比率。
#convert to factors to make sure you will get 0 frequencies with table as well
df[-1] <- lapply(df[-1], as.factor)
fun1 <- function(df, n){as.data.frame(t(sapply(split(df, df$id), function(i)
prop.table(table(i[,n])))))}
data.frame(id = unique(sort(df$id)),
do.call(cbind, sapply(2:ncol(df), function(i)fun1(df, i))))
# id A B FALSE. TRUE. X3 X4 X5 X6
#1 1 0.0000000 1.0000000 0.0 1.0 0.0000000 0.0000000 1 0.0000000
#2 2 0.5000000 0.5000000 0.5 0.5 0.0000000 1.0000000 0 0.0000000
#3 3 0.6666667 0.3333333 1.0 0.0 0.3333333 0.3333333 0 0.3333333
构建它的另一种方法是创建一个列表,并使用原始df的列名命名列表的每个元素。即。
l1 <- sapply(2:ncol(df), function(i)fun1(df, i))
names(l1) <- names(df[-1])
#so you can extract each one separately,
l1[['prop1']]
# A B
#1 0.0000000 1.0000000
#2 0.5000000 0.5000000
#3 0.6666667 0.3333333
答案 1 :(得分:1)
我想你想要这个:
library(reshape)
df[-1] <- lapply(df[-1],as.factor)
# second, rearrange vars in a named vector
df <- melt(df,id=c("id"),variable_name = "prop")
df$prop <- as.factor(df$prop)
#third, make the histograms with ggplot2
library(ggplot2)
h <- ggplot(df,aes(x=id))
h + geom_bar(stat="count", aes(fill=id)) + facet_grid(~ prop + value)