如何使用* * *键值对来传播数据帧

时间:2018-02-18 19:34:34

标签: r tidyr spread

我有一个包含两列的数据框:公司名称和长格式的标签。每个公司都附加了可变数量的标签,从而产生大约80,000行:

Company   Tags

Company A Tag A
Company A Tag B
Company A Tag C
Company B Tag A
Company B Tag B
Company B Tag C
Company B Tag D
Company B Tag E
Company B Tag F
Company C Tag A
Company C Tag B
Company C Tag C
Company C Tag D

我想把它变成一种宽格式:

Company   Tag 1   Tag 2   Tag 3   Tag 4    Tag 5   Tag 6 

Company A Tag A   Tag B   Tag C
Company B Tag A   Tag B   Tag C   Tag D    Tag E   Tag F
Company C Tag A   Tag B   Tag C   Tag D

传播不起作用,因为它希望我传递一个列,它将成为宽格式的列名,但我没有。所以我无法按原样传播它。看起来我有两个选择:

  1. 创建另一个列,每个公司都附有数字,以宽格式作为列名。但我不知道如何在代码中为每家公司做到这一点。

  2. 找到一个包含一个函数的包,该函数可以比Spread更灵活地投射数据框。 Splitstackshape可以很好地将数据帧转换为格式,但不是相反。

  3. 任何建议将不胜感激!此外,我很乐意学习如何更好地格式化这些表,而无需做一堆手动标签/间距。

4 个答案:

答案 0 :(得分:4)

你的选择1是要走的路;但只要提供您提供的信息,就无法确定值应该转到哪一列(根据订单创建的Tag <num>列或原始Tags列的?)。但是,如果我们假设新列是根据排序创建的,那么您只需group_by Company值并使用row_number()创建一个变量作为{{{{}后的所需列名称1}进入宽格式。

spread

reprex package(v0.2.0)创建于2018-02-18。

答案 1 :(得分:2)

对于您的示例,您可以考虑使用table,这会产生类似的结果

table(df)
#            Tags
# Company     Tag A Tag B Tag C Tag D Tag E Tag F
# Company A     1     1     1     0     0     0
# Company B     1     1     1     1     1     1
# Company C     1     1     1     1     0     0

如果您现在希望每个值都代表列名,则可以运行

tb <- table(df)
z <- which(tb==1, arr.ind=T)
tb[z]<-colnames(tb)[z[,2]]
tb
 #         Tags
 # Company    Tag A Tag B Tag C Tag D Tag E Tag F
 #  Company A Tag A Tag B Tag C 0     0     0    
 #  Company B Tag A Tag B Tag C Tag D Tag E Tag F
 #  Company C Tag A Tag B Tag C Tag D 0     0    

答案 2 :(得分:2)

另一个更简单的选择可能是使用dcast中的reshape2。如果OP有兴趣在转换后重命名列,那么它也会更容易。必须创建一个向量,使列Tag ATag F

的名称不同
library(reshape2)
> dcast(df, Company ~ Tags)
#    Company Tag A Tag B Tag C Tag D Tag E Tag F
#1 Company A Tag A Tag B Tag C  <NA>  <NA>  <NA>
#2 Company B Tag A Tag B Tag C Tag D Tag E Tag F
#3 Company C Tag A Tag B Tag C Tag D  <NA>  <NA>


# Data
df <- read.table( text = "Company   Tags
'Company A' 'Tag A'
'Company A' 'Tag B'
'Company A' 'Tag C'
'Company B' 'Tag A'
'Company B' 'Tag B'
'Company B' 'Tag C'
'Company B' 'Tag D'
'Company B' 'Tag E'
'Company B' 'Tag F'
'Company C' 'Tag A'
'Company C' 'Tag B'
'Company C' 'Tag C'
'Company C' 'Tag D'", header = T, stringsAsFactor = F)

答案 3 :(得分:0)

这个怎么样?

   Company Tag1 Tag2 Tag3 Tag4 Tag5 Tag6
1 CompanyA TagA TagB TagC <NA> <NA> <NA>
2 CompanyB TagA TagB TagC TagD TagE TagF
3 CompanyC TagA TagB TagC TagD <NA> <NA>

输出:

Rate=k*Concentration^n