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