我试图创建一个包含许多列的数据表,但却无法想到一种简洁的方法(使用dplyr
或其他内容)。我们来考虑这些数据:
URL TERM
google.com dog
yahoo.com cat
bing.com hamster
google.com dog
google.com cat
yahoo.com cat
bing.com dog
yahoo.com cat
我想结束这样的事情:
URL dog cat hamster
google.com 2 1 0
yahoo.com 0 3 0
bing.com 1 0 1
我可以使用for
循环来实现这一点......但我也不能使用R.基本上,我想按URL
进行分组,创建一个新列对于每个唯一TERM
值,其中每列包含每个TERM
的所述URL
的计数。
有什么想法吗?
答案 0 :(得分:2)
这可以看作是将数据帧从长到大整形的问题,这可以通过R中的各种方式实现。有关详细信息,请查看link。
在你的情况下,这可以做到:
library(reshape2)
dcast(df, URL ~ TERM)
答案 1 :(得分:1)
这里实际上有两个操作:(1)聚合URL
和TERM
以产生每个这样的复合键的计数,以及(2)从长格式到宽格式的整形。
在纯基础R中,您可以使用aggregate()
和reshape()
的组合来执行此操作:
reshape(aggregate(num~.,cbind(df,num=1L),sum),dir='w',idvar='URL',timevar='TERM');
## URL num.cat num.dog num.hamster
## 1 google.com 1 2 NA
## 2 yahoo.com 3 NA NA
## 3 bing.com NA 1 1
答案 2 :(得分:-1)
一个非常简单的工作代码。它可能不是最好的,但它正在给出结果。我会很感激它的一些改进。请在下面找到输出:
bevs <- data.frame(cbind( col1=c("google.com", "yahoo.com","bing.com","google.com","google.com","yahoo.com","bing.com","yahoo.com") ,col2= c("dog", "cat", "hamster", "dog","cat","cat","dog","cat")))
bevs
library(plyr)
tab<-count(bevs, c("col1", "col2"))
r=matrix(NA,length(levels(tab$col1)),length(levels(tab$col2)))
rownames(r)=levels(tab$col1)
colnames(r)=levels(tab$col2)
for(i in levels(tab$col1))
{
for(j in levels(tab$col2))
{
if(length(tab$freq[tab$col1==i&tab$col2==j])==0)
r[i,j]=0
else
r[i,j]=tab$freq[tab$col1==i&tab$col2==j]
}
}
r
输出:
cat dog hamster
bing.com 0 1 1
google.com 1 2 0
yahoo.com 3 0 0
在此处找到代码http://www.r-fiddle.org/#/fiddle?id=BveQws3p&version=10