【问题标题】:Transpose data frame based on a name column基于名称列转置数据框
【发布时间】:2017-08-10 23:21:52
【问题描述】:

我想使用名称列转置数据框以创建新的列名。这是我的意见:

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

我虽然可以转置函数,但我不确定如何处理列名和行名。

提前致谢!

【问题讨论】:

  • 这些真的是row.names 还是一个名为Name 的列?你展示它的方式使它看起来像后者。您能否与dput() 共享数据,以便复制/粘贴且结构明确?
  • 其实是后者,你建议在帖子里怎么称呼,让我编辑一下?
  • 试试library(tidyverse); df %>% separate(Name, into = c("Sample", "Name")) %>% gather(Key, Value, -Sample, -Name) %>% unite(Res, Key, Name, sep = "") %>% spread(Res, Value)
  • 我只想说“...使用我的Name 列的一部分来创建新的列名”。

标签: r dataframe transpose


【解决方案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

【讨论】:

  • 谢谢,但是否可以不在“value.var”中指定值,因为在真实数据集中有多个 value.var
  • 并有更灵活的附加后缀方式,例如_A 而不仅仅是 A
  • @user2904120 您可以使用列名,即names(df1)[-1],即dcast(setDT(df1)[, c("Name", "grp") := tstrsplit(Name, "_")], Name ~grp, value.var = names(df1)[2:4], sep="")
  • 太棒了,有什么办法可以更灵活地添加后缀,添加“_A”而不是“A”
  • @user2904120 只需删除sep="" 或使用sep="_"
猜你喜欢
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 2020-01-30
  • 2017-06-08
  • 2023-03-12
  • 2018-10-19
相关资源
最近更新 更多