我试图通过大型数据集重复将一个数据帧的行子集绑定到11个其他数据帧的行子集。 E.g。
df=JAN df=FEB
Day Jan Day Feb
1 70 1 66
2 70 2 66
3 70 3 66
4 70 4 66
5 70 5 66
6 70 6 66
7 70 7 66
8 70 8 66
9 70 9 66
10 70 10 66
11 70 11 66
12 70 12 66
13 70 13 66
14 70 14 66
15 70 15 66
16 70 16 66
17 70 17 66
18 70 18 66
19 70 19 66
20 70 20 66
21 70 21 66
22 70 22 66
23 70 23 66
24 70 24 66
25 70 25 66
26 70 26 66
27 70 27 66
28 70 28 66
29 70
30 70
31 70
............................
在上面的例子中,我想做的是从df Jan cbind行1:31,从df 2月到行1:28到df Dec的行1:31(未显示),然后继续cbind为1月的下一个31天(即从1月1日开始的32:62行),然后是2月2日的29:56行,依此类推。
总共有12个数据框(每个月一个)采用如图所示的形式。每个数据框中有120个月的数据。
我的输出应该是一列,如下所示:
70 (repeated 31 times)
66 (repeated 28 times)
......................
我已经搜索过该网站和其他人寻求帮助,但在这里找不到任何直接适用的内容。有什么建议吗?
答案 0 :(得分:0)
你可以这样做:
df <- read.table(text = " Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1 70 64 58 66 61 59 53 56 69 77 74 72
2 70 64 58 66 61 59 53 56 69 77 74 72
3 71 57 49 62 66 58 55 44 73 87 69 64
4 71 57 49 62 66 58 55 44 73 87 69 64")
row_pairs <- lapply(seq(1, nrow(df), by=2), function(x) df[x:(x+1), ])
vec_of_pairs <- do.call(c, lapply(row_pairs, unlist))
unname(vec_of_pairs)
[1] 70 70 64 64 58 58 66 66 61 61 59 59 53 53 56 56 69 69 77 77 74 74 72 72 71 71
[27] 57 57 49 49 62 62 66 66 58 58 55 55 44 44 73 73 87 87 69 69 64 64
答案 1 :(得分:0)
我们使用gl
为每2行创建一个分组变量,在数据集的tapply
,unlist
中使用该变量来获得预期的输出。
unlist(tapply(as.matrix(df2), as.numeric(gl(nrow(df2), 2, nrow(df2)))[row(df2)],
FUN=unlist), use.names=FALSE)
#[1] 70 70 64 64 58 58 66 66 61 61 59 59 53 53 56 56 69 69 77 77 74 74 72 72 71
#[26] 71 57 57 49 49 62 62 66 66 58 58 55 55 44 44 73 73 87 87 69 69 64 64
基于更新的数据集
lst <- mget(toupper(month.abb[1:2]))
#Here I am using only JAN and FEB, so `[1:2]`
#For the OP's dataset, we need
# lst <- mget(toupper(month.abb))
library(data.table)
DT <- rbindlist(lapply(lst, function(x)
transform(x, GROUP= cumsum(c(TRUE,diff(Day)<0)))), idcol=TRUE)
unlist(split(DT$Jan, DT$GROUP), use.names=FALSE)
# [1] 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70 70
# [26] 70 70 70 70 70 70 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
# [51] 66 66 66 66 66 66 66 66 66 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
# [76] 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 65 65 65 65 65 65 65 65 65 65
#[101] 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65
JAN <- data.frame(Day= rep(1:31, 2), Jan =rep(c(70, 42), each=31))
FEB <- data.frame(Day= rep(1:28, 2), Feb =rep(c(66, 65), each=28))