2017-08-10 104 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