【发布时间】:2014-11-27 20:54:28
【问题描述】:
我正在尝试在具有数百万行的深度矩阵/数据帧(列:id、变量、值)中查找模式的频率。这在如下所示的宽矩阵中很容易做到。我想知道是否有办法在不首先转换为宽格式的情况下做同样的事情(在深矩阵中)。谢谢。
require(dplyr)
require(tidyr)
set.seed(100)
ncol <- 10
nrow <- 100000
#create sample matrix in wide format
df1 <- as.data.frame(matrix((runif(nrow*ncol)>0.8) + 0, ncol=ncol))
cols <- colnames(df1)
df1 <- filter(df1, rowSums(df1)>0)
df1 <- cbind(id=seq_len(nrow(df1)), df1)
#compute frequency of patterns
out1 <- df1 %>%
group_by_(.dots=cols) %>% summarise(freq=n()) %>% as.data.frame() %>% arrange(desc(freq))
#convert to deep format
df2 <- df1 %>%
gather(variable, value, -id) %>% filter(value>0)
#compute frequency of patterns
out2 <- df2 %>% spread(variable, value, fill=0) %>%
group_by_(.dots=cols) %>% summarise(freq=n()) %>% as.data.frame() %>% arrange(desc(freq))
identical(out1, out2)
【问题讨论】:
-
很难说你想做什么。什么图案?请使示例数据更小,并显示您想要的结果。也许您正在寻找
rowwise() -
@RichardScriven,当您将问题缩小到 10x100 时,您可以理解问题 - 计算重复行(除“id”之外的所有列)。
-
@RichardScriven 请将 ncol 设置为 3 并将 nrow 设置为 50 以获得一个小例子。
-
@ironv - 请记住,您是寻求帮助的人,因此您应该付出额外的努力,让人们尽可能轻松地帮助您。