0

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

所以对于第 48 行,我希望接下来的 48 行移动到一个新列。

怎么做?

4

4 回答 4

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
于 2013-11-02T12:55:53.003 回答
0

就像stack在 R 中创建一组列的很长表示一样,也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
于 2013-11-02T15:49:50.240 回答
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))
于 2013-11-02T12:37:01.690 回答
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]
}
于 2013-11-02T12:28:27.097 回答