如何在R或excel中将不同的组从一列转移到另一行

时间:2013-02-17 01:29:01

标签: r excel transpose

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

我的数据看起来像这样(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

由于我有很多小组,我不能一个一个地手动完成。有人可以帮帮我吗?谢谢。

谢谢大家,因为所有小组都有相同的长度(灵感来自Floris的评论),实际上我只需使用矩阵来解决问题

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果您知道如何使用VBA,那么编写一个可以为您执行此操作的短子()非常简单。我很难编码地址 - 你可以弄清楚如何移动它。我假设您在调用此宏时,您的数据在活动工作表上,并且您希望副本显示在原始工具的右侧(在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

我无法测试这个,但我相信这很好。如果您遇到问题,请发表评论。

答案 2 :(得分:0)

将单元格的集群从列转移到行

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

C2,横向和向下复制:

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

相应地调整参考文献。

首先尝试一行然后执行下一行,然后合并