将n行的子集从一个数据帧绑定到muliple其他数据帧的不同n行的子集

时间:2015-10-15 11:27:35

标签: r

我试图通过大型数据集重复将一个数据帧的行子集绑定到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)
......................

我已经搜索过该网站和其他人寻求帮助,但在这里找不到任何直接适用的内容。有什么建议吗?

2 个答案:

答案 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行创建一个分组变量,在数据集的tapplyunlist中使用该变量来获得预期的输出。

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))