0

我搜索了一些答案,但似乎没有人能回答我的问题

我的数据看起来像这样(2 列,2 组组“1”和组“2”)

  • 1 10
  • 1 20
  • 1 50
  • 2 40
  • 2 30
  • 2 60

我想按每组将它从列转置到行,结果将如下所示

  • 1 1 1
  • 10 20 50
  • 2 2 2
  • 40 30 60

由于我有很多组,我无法一个一个手动完成。有人可以帮我吗?谢谢你。

谢谢大家,因为所有组的长度都相同(受弗洛里斯评论的启发),实际上我可以简单地使用矩阵来解决问题

    x=read.table(header=F,text="10 20 50 40 30 60")
    matrix(x,nrow=2,byrow=T)
4

3 回答 3

4
x <- read.table(header=F, text="1 10
1 20
1 50
2 40
2 30
2 60")

do.call(rbind, by(x, x$V1, FUN=t))
##     1  2  3
## V1  1  1  1
## V2 10 20 50
## V1  2  2  2
## V2 40 30 60
于 2013-02-17T01:58:13.850 回答
1

如果您知道如何使用 VBA,那么编写一个简短的 sub() 来为您完成这项工作非常简单。我正在硬编码地址 - 你可以弄清楚如何移动它。我假设当您调用此宏时您的数据位于活动工作表上,并且您希望副本显示在原始数据的右侧(在 A 和 B 列中,从第 2 行开始 - 为您提供上面的标签空间)。此外,我将假设您的组编号为 1、2、3...,并且您不需要复制它们的值。然后代码看起来像这样(按F-11打开VBA编辑器,插入一个模块,然后复制这个)

Sub bigSwap()
dim R as Range, c as Range
dim grp
dim grpCount(1 To 100) ' assuming no more than 100 groups, or adjust this number
dim i

' just making sure it's properly initialized
for i=1 To 100
  grpCount(ii)=0
next i


Set R = Range("B2", [B2].End(xlDown)) ' this finds all the cells with values
' note - I am using [B2] as shorthand for Range("B2")

For each c in R.cells
  grp = c.offset(0, -1).value  ' find the corresponding group
  [D1].offset(grp, grpCount(grp)).value = c.value
  grpCount(grp) = grpCount(grp)+1  ' keep track of # in this row
next

End Sub

我无法对此进行测试,但我相信它很好。如果您遇到问题,请发表评论。

于 2013-02-17T02:03:19.857 回答
0

将单元格簇从列转置到行

假设 A2:A16 包含数据,请尝试...

C2,上下复制:

=INDEX($A$2:$A$16,ROWS(C$2:C2)*3-3+COLUMNS($C2:C2))

相应地调整参考。

先尝试一行,然后再做下一行,然后合并

于 2016-01-20T11:08:11.363 回答