R - 从不同的行值创建单独的列

时间:2016-06-27 19:23:31

标签: r

我试图创建一个包含许多列的数据表,但却无法想到一种简洁的方法(使用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的计数。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

这可以看作是将数据帧从长到大整形的问题,这可以通过R中的各种方式实现。有关详细信息,请查看link

在你的情况下,这可以做到:

library(reshape2)
dcast(df, URL ~ TERM)

答案 1 :(得分:1)

这里实际上有两个操作:(1)聚合URLTERM以产生每个这样的复合键的计数,以及(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