将单元格移动到每个第48行的新列

时间:2013-11-02 12:16:28

标签: r excel row

我在A1:A144中有名字列表,我想将A49:A96移动到B1:B48和A97:144移动到C1:C48。

因此,对于每个第48行,我希望接下来的48行移动到新列。

怎么做?

4 个答案:

答案 0 :(得分:2)

如果您想考虑VBA替代方案,那么:

Sub MoveData()
    nF = 1
    nL = 48
    nSize = Cells(Rows.Count, "A").End(xlUp).Row
    nBlock = nSize / nL
    For k = 1 To nBlock
        nF = nF + 48
        nL = nL + 48
        Range("A" & nF & ":A" & nL).Copy Cells(1, k + 1)
        Range("A" & nF & ":A" & nL).ClearContents
    Next k
End Sub

答案 1 :(得分:0)

不确定此解决方案的可扩展性如何,但确实有效。

首先让我们假装您的名字为x,并且您希望解决方案位于new.df

number.shifts <- ceiling(length(x) / 48) # work out how many columns we need

# create an empty (NA) data frame with the dimensions we need
new.df <- matrix(data = NA, nrow = length(x), ncol = number.shifts) 

# run a for-loop over the x, shift the column over every 48th row
j <- 1
for (i in 1:length(x)){
  if (i %% 48 == 0) {j <- j + 1}
  new.df[i,j] <- x[i]
}

答案 2 :(得分:0)

我认为你必须再详细说明你的问题。你有R或Excel中的数据,你想要输出在R或Excel吗?

如果x是你的向量指示群集

那么说
x <- rep(1:3, each = 48)

y是包含名称的变量或要在A:C(每行有48行)上分发的任何内容,

y <- sample(letters, 3 * 48, replace = TRUE)

你可以这样做:

y.wide <- do.call(cbind, split(y, x))

答案 3 :(得分:0)

就像在R中有stack来创建一组列的非常长的表示一样,unstack可以使用一个长列并使其成为一个宽的形式。

这是一个基本的例子:

mydf <- data.frame(A = 1:144)
mydf$groups <- paste0("A", gl(n=3, k=48))  ## One of many ways to create groups
mydf2 <- unstack(mydf)
head(mydf2)
#   A1 A2  A3
# 1  1 49  97
# 2  2 50  98
# 3  3 51  99
# 4  4 52 100
# 5  5 53 101
# 6  6 54 102
tail(mydf2)
#    A1 A2  A3
# 43 43 91 139
# 44 44 92 140
# 45 45 93 141
# 46 46 94 142
# 47 47 95 143
# 48 48 96 144