Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从时间数据创建堆叠面积图_R_Ggplot2_Reshape - Fatal编程技术网

R 从时间数据创建堆叠面积图

R 从时间数据创建堆叠面积图,r,ggplot2,reshape,R,Ggplot2,Reshape,我是一名社会科学研究员,致力于想象人们如何在社区中扮演各种角色 我已经将人们的每月行为分类为角色类别,现在我想可视化每个角色在每个(相对)时间段的人数和比例 现在,数据位于CSV中,看起来像这样: ID T1 T2 T3 ... 1 2 2 3 2 1 0 2 3 1 2 1 ... 其中X(ij)是我在第j个月时所在的集群ID 我想要的是这样的东西(我在诽谤中创造的)。 我相信我需要使用ggplot2,但我一直在努力找出如何以ggplot喜欢的格式

我是一名社会科学研究员,致力于想象人们如何在社区中扮演各种角色

我已经将人们的每月行为分类为角色类别,现在我想可视化每个角色在每个(相对)时间段的人数和比例

现在,数据位于CSV中,看起来像这样:

ID  T1  T2  T3 ...
1   2   2   3
2   1   0   2
3   1   2   1
...
其中X(ij)是我在第j个月时所在的集群ID

我想要的是这样的东西(我在诽谤中创造的)。

我相信我需要使用ggplot2,但我一直在努力找出如何以ggplot喜欢的格式获取数据

我想我的第一个任务是在每个时间段总结每个集群?有没有一个简单的方法

我可以用下面的代码来实现这一点,但它既糟糕又混乱,必须有更好的方法来实现吗

clus1 <- apply(clusters, 2, function(x) {sum(x=='1', na.rm=TRUE)})
clus2 <- apply(clusters, 2, function(x) {sum(x=='2', na.rm=TRUE)})
clus3 <- apply(clusters, 2, function(x) {sum(x=='3', na.rm=TRUE)})
clus0 <- apply(clusters, 2, function(x) {sum(x=='0', na.rm=TRUE)})
clusters2 <- data.frame(clus0, clus1, clus2, clus3)
c2 <- t(clusters2)
c3 <- as.data.frame(c2)
c3$id = c('Low Activity Cluster', 'Cluster 1', 'Cluster 2', 'Cluster 3')
c3 <- c3[order(c3$'id'),]
print(ggplot(melt(c3, id.vars="id")) +
  geom_area(aes(x=variable, y=value, fill=id, group=id), position="fill"))

这是正确的策略吗?

编辑,试图解决评论:

`rownames<-`(
  as.data.frame(lapply(df[-1], function(x) as.numeric(table(x)))), 
  paste("Clust ", 0:3)
)
这将使用
统计每个时间段每个簇类型(0:3)的出现次数。关键代码是
lappy(…)
。它周围的东西非常漂亮

关于数据:

set.seed(1)
labels <- paste("Clust ", 0:3)
df <- as.data.frame(c(list(ID=1:20), setNames(replicate(10, factor(sample(0:3, 20, rep=T)), simplify=F), paste0("T", 1:10))))

需要一点时间来适应
ggplot
,但一旦你习惯了,这基本上是直观的。你应该先看看melt(df,id.vars=“id”)的结果,看看我所说的“长格式”是什么意思。然后,在这种情况下,我们使用
geom_区域
,并在
aes
中指定
x
值(
variable
是由
melt
产生的名称,在这种情况下,它包含
time
值),
y
值(
value
也是由
melt
创建的),并且还指定我们区域填充的颜色应该来自
ID
。请注意,因为我们在这里使用的时间是分类的(T1、T2等,而不是实际日期),除了使用
fill
外,我们还必须使用
group
,以便
ggplot
知道您希望连接不同时间的点

注意,在打印之前不需要执行聚合步骤。
ggplot
可以在内部处理它。以下命令是等效的(注意我们如何使用
df.mlt
):

这是我使用的数据:

df <- as.data.frame(c(list(ID=rep(factor(0:3), 3)), setNames(replicate(10, sample(1:10, 12, rep=T), simplify=F), paste0("T", 1:10))))

df这真的非常有帮助,但我认为这是问题的后半部分。我可能对前半部分不够清楚。我不想描绘每个用户的角色随时间的变化,而是我想描绘所有角色随时间的比例。我会调整原始问题以澄清问题。我不确定我做错了什么,但t不起作用。我的df.agg有3列-id、variable和value,其中的值只是当时该用户的集群。我正在用一些似乎有效的代码为我的问题添加一些注释,尽管它是复杂的代码。@Jeremy,这很正常。请看下一步(dcast
)。这将三列格式(长格式)转换为您希望看到的格式(宽格式)。大多数对组进行操作的R分析工具(包括
ggplot
)都使用长格式数据(在本例中为三列版本)。我想问题可能是我对原始数据解释得不够好。第一列(ID)表示用户ID,而不是群集ID。因此,有数千行,具有不同的ID。我的目标是每次跨ID聚合群集值(即表中的值)。作为旁注,非常感谢您的帮助!!!
set.seed(1)
labels <- paste("Clust ", 0:3)
df <- as.data.frame(c(list(ID=1:20), setNames(replicate(10, factor(sample(0:3, 20, rep=T)), simplify=F), paste0("T", 1:10))))
library(reshape2)
library(ggplot2)
df.mlt <- melt(df, id.vars="ID")
df.agg <- aggregate(. ~ ID + variable, df.mlt, sum)
dcast(df.agg, ID ~ variable)  # just for show, we don't use the result anyplace

#   ID T1 T2 T3 T4 T5 T6 T7 T8 T9 T10
# 1  0 25 18 29 23 16 15 14 22 29  19
# 2  1  7  7 14 18 19 11 21 17 15  22
# 3  2 16 15 16 20 23 20 16 13 15  12
# 4  3 14 13 20 17 25 14 13  7 21  24

ggplot(df.agg) +
  geom_area(aes(x=variable, y=value, fill=ID, group=ID), position="fill") 
ggplot(df.mlt) +
  stat_summary(aes(x=variable, y=value, fill=ID, group=ID), fun.y=sum, position="fill", geom="area") 
df <- as.data.frame(c(list(ID=rep(factor(0:3), 3)), setNames(replicate(10, sample(1:10, 12, rep=T), simplify=F), paste0("T", 1:10))))