2017-08-10 106 views
1

我想使用名称列转置数据帧以创建新列名称。这是我输入:基于名称列转置数据帧

Name  X Y Z 
sample1_A 1 2 3 
sample1_B 3 2 1 
sample2_A 1 2 3 
sample2_B 3 2 1 

和预期输出:

Name XA XB YA YB ZA ZB 
sample1 1 3 2 2 3 1 
sample2 1 3 2 2 3 1 

不过,我觉得我,你可以转功能,但我不知道该如何处理列和行的名称。

在此先感谢!

+1

是那些真正的'row.names'或者是一个叫做'Name'列?你展示它的方式使它看起来像后者。你可以用'dput()'分享数据,所以它是复制/粘贴的,结构是明确的? – Gregor

+0

它实际上是后者,你如何建议在帖子中调用它,以便我可以编辑它? – user2904120

+5

试试'library(tidyverse); df%>%separate(Name,into = c(“Sample”,“Name”))%>%gather(Key,Value,-Sample,-Name)%>%unite(Res,Key,Name,sep =“ “)%>%spread(Res,Value)' –

回答

1

我们可以使用从data.tabledcast可以采取多种value.var

library(data.table) 
dcast(setDT(df1)[, c("Name", "grp") := tstrsplit(Name, "_")], 
       Name ~grp, value.var = c("X", "Y", "Z"), sep = "") 
#  Name XA XB YA YB ZA ZB 
#1: sample1 1 3 2 2 3 1 
#2: sample2 1 3 2 2 3 1 
+0

谢谢,但是有可能不指定'value.var'中的值,因为在真实数据集中存在多个value.var – user2904120

+0

,并且具有更灵活的附加后缀的方式,例如, _A而不仅仅是A – user2904120

+1

@ user2904120您可以使用列名即'names(df1)[ - 1]'ie'dcast(setDT(df1)[,c(“Name”,“grp”):= tstrsplit(Name ,“_”)],Name〜grp,value.var = names(df1)[2:4],sep =“”)' – akrun