R 如何使用*仅*一个键值对扩展数据帧

R 如何使用*仅*一个键值对扩展数据帧,r,tidyr,spread,R,Tidyr,Spread,我有一个包含两列的数据框架:公司名称和长格式的标签。每个公司都有不同数量的标签,大约有8万行: 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

我有一个包含两列的数据框架:公司名称和长格式的标签。每个公司都有不同数量的标签,大约有8万行:

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
Spread不起作用,因为它希望我向它传递一个列,该列将成为宽格式的列名,但我没有。所以我不能按原样传播。看来我有两个选择:

创建另一列,将数字附加到每个公司,用作宽格式的列名。但我不知道如何在每个公司的代码中做到这一点

找到一个具有比Spread更灵活地转换数据帧的函数的包。Splitstackshape可以很好地将数据帧转换为长格式,但反过来就不行了

任何建议都将不胜感激!此外,我还想学习如何更好地设置这些表格的格式,而不必进行大量的手动制表符/间距设置。

你的选择1是一条路要走;但是,仅根据您提供的信息,无法确定值应该指向哪个列,即根据原始标记列的顺序或值创建的标记列?。但是,如果我们假设新列是根据排序创建的,那么您可以根据公司值对_进行分组,并使用row_number创建一个变量,在扩展为宽格式后用作所需的列名

图书馆管理员 df% 集团公司%>% mutatetag\u column=str\u cTag,行数%>% 电子标签栏,标签 >一个tibble:3x7 >组别:公司[3] >公司标记1标记2标记3标记4标记5标记6 > >1公司A标签A标签B标签C >2公司B标签A标签B标签C标签D标签E标签F >3公司C标签A标签B标签C标签D 2018年2月18日由v0.2.0创建。

你的选择1是一条路要走;但是,仅根据您提供的信息,无法确定值应该指向哪个列,即根据原始标记列的顺序或值创建的标记列?。但是,如果我们假设新列是根据排序创建的,那么您可以根据公司值对_进行分组,并使用row_number创建一个变量,在扩展为宽格式后用作所需的列名

图书馆管理员 df% 集团公司%>% mutatetag\u column=str\u cTag,行数%>% 电子标签栏,标签 >一个tibble:3x7 >组别:公司[3] >公司标记1标记2标记3标记4标记5标记6 > >1公司A标签A标签B标签C >2公司B标签A标签B标签C标签D标签E标签F >3公司C标签A标签B标签C标签D

>由V0.2.02./P>< P>在2018~02-18中创建,对于您的示例,您可以考虑仅使用表,它产生了类似的结果

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    

对于您的示例,您可以考虑仅使用表,它产生了类似的结果

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    

另一个更简单的选择是使用Reforme2中的dcast。如果OP有兴趣在转换后重命名列,那么也会更容易。只需创建一个向量,就可以为标记a到标记F的列指定不同的名称


另一个更简单的选择是使用Reforme2中的dcast。如果OP有兴趣在转换后重命名列,那么也会更容易。只需创建一个向量,就可以为标记a到标记F的列指定不同的名称

这个怎么样

data <- read.table(text="Company Tag
                   CompanyA TagA
                   CompanyA TagB
                   CompanyA TagC
                   CompanyB TagA
                   CompanyB TagB
                   CompanyB TagC
                   CompanyB TagD
                   CompanyB TagE
                   CompanyB TagF
                   CompanyC TagA
                   CompanyC TagB
                   CompanyC TagC
                   CompanyC TagD
                   ",header=TRUE)

library(reshape2)
d = dcast(data,Company~Tag,value.var = "Tag")
names(d)[grep("^Tag", names(d))] = paste("Tag", 1:(ncol(d)-1), sep = "" )
输出:

   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>
这个怎么样

data <- read.table(text="Company Tag
                   CompanyA TagA
                   CompanyA TagB
                   CompanyA TagC
                   CompanyB TagA
                   CompanyB TagB
                   CompanyB TagC
                   CompanyB TagD
                   CompanyB TagE
                   CompanyB TagF
                   CompanyC TagA
                   CompanyC TagB
                   CompanyC TagC
                   CompanyC TagD
                   ",header=TRUE)

library(reshape2)
d = dcast(data,Company~Tag,value.var = "Tag")
names(d)[grep("^Tag", names(d))] = paste("Tag", 1:(ncol(d)-1), sep = "" )
输出:

   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>

选择1是正确的选择。谢谢你,米科!我设想了一个这样的解决方案,但不知道如何实现它。我有点惊讶row_number与group_by一起工作-这不像较大数据帧的行号在变化。@pez您可以通过将数据划分为独立的子集来考虑group_,然后所有其他动词都将对这些子集进行操作,就好像它们是独立的数据帧一样。在这种情况下,行数行为非常合理。选择1是正确的选择。谢谢你,Mikko!我设想了一个这样的解决方案,但不知道如何实现它。我有点惊讶row_number与group_by一起工作-这不像较大数据帧的行号在变化。@pez您可以通过将数据划分为独立的子集来考虑group_,然后所有其他动词都将对这些子集进行操作,就好像它们是独立的数据帧一样。在这种情况下,行数行为非常有意义。匹配OP预期的好方法。匹配OP预期的好方法。