我在 A1:A144 中有名称列表,我想将 A49:A96 移动到 B1:B48 和 A97:144 到 C1:C48。
所以对于第 48 行,我希望接下来的 48 行移动到一个新列。
怎么做?
如果您想考虑使用 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
就像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
我认为您必须再详细说明您的问题。您是否有 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))
不确定此解决方案的可扩展性如何,但它确实有效。
首先让我们假设您的名字是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]
}