Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.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 - Fatal编程技术网

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

R-从不同的行值创建单独的列,r,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

我试图创建一个包含许多列的数据表,但想不出一种简洁的方法(使用
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
分组,为每个唯一的
术语
值创建一个新列,其中每个列包含每个
URL
的所述
术语
的计数


有什么想法吗?

这可以看作是一个从长到宽重塑数据帧的问题,在R中可以通过多种方式实现。有关更多信息,请查看此

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

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

这可以看作是一个将数据帧从长到宽进行重塑的问题,在R中可以通过多种方式实现。有关更多信息,请查看此项

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

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

这里实际上有两个操作:(1)在
URL
TERM
上进行聚合,以生成每个这样的复合键的计数;(2)从长格式到宽格式进行重塑

在纯base R中,您可以使用和的组合来执行此操作:

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

这里实际上有两个操作:(1)在
URL
TERM
上进行聚合,以生成每个这样的复合键的计数;(2)从长格式到宽格式进行重塑

在纯base R中,您可以使用和的组合来执行此操作:

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

一个非常简单的工作代码。这可能不是最好的,但它给出了结果。如果能有所改进,我将不胜感激。请查看以下输出:

     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

在这里找到代码

一个非常简单的工作代码。这可能不是最好的,但它给出了结果。如果能有所改进,我将不胜感激。请查看以下输出:

     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

在这里找到代码

as.data.frame.matrix(table(df))
as.data.frame.matrix(table(df))
有人能解释一下我的答案有什么问题吗。评论会很有帮助。谢谢有些人可能不喜欢你的代码不简洁(将其与此处和投票关闭链接中的其他答案进行比较)。谢谢你的反馈。我同意它不简洁。那么我应该删除它吗?有人能解释一下我的答案有什么问题吗。评论会很有帮助。谢谢有些人可能不喜欢你的代码不简洁(将其与此处和投票关闭链接中的其他答案进行比较)。谢谢你的反馈。我同意它不简洁。那么我应该把它移除吗?