R 将一个数据帧中n行的子集绑定到多个其他数据帧中不同n行的子集
我试图通过一个大型数据集,将一个数据帧中的行子集重复绑定到11个其他数据帧中的行子集。例如R 将一个数据帧中n行的子集绑定到多个其他数据帧中不同n行的子集,r,R,我试图通过一个大型数据集,将一个数据帧中的行子集重复绑定到11个其他数据帧中的行子集。例如 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
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 Feb开始cbind第1:28行,到df Dec结束cbind第1:31行(未显示),然后在一月的接下来31天继续cbind(即从df Jan开始cbind第32:62行),然后从df Feb开始cbind第29:56行,依此类推
共有12个数据帧(每个月一个),其形式如图所示。每个数据帧中有120个月的数据
我的输出应为单列,如下所示:
70 (repeated 31 times)
66 (repeated 28 times)
......................
我已经搜索了这个网站和其他网站寻求帮助,但在这里找不到任何直接适用的东西。有什么建议吗?您可以这样做:
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
df您可以这样做:
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
df我们使用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
lst我们使用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
lst请给出一个小示例和期望的输出,以便更容易理解。您是指concatenate-c()-而不是cbind吗?一列中的第1:2行将只有两个数字。谢谢@akrun-我现在已经这样做了。您有矩阵或data.frame吗?我有@akrun,但不知道如何在此处列出它。请显示一个小示例和预期输出,以便更容易理解。您是指连接-c()-而不是cbind吗?一列中的第1:2行将只有两个数字。谢谢@akrun-我现在已经完成了。你有矩阵或data.frame吗?我有@akrun,但不知道如何在这里找到它这是一个伟大的解决方案@akrun。谢谢你提供。还有一个问题:在我的真实数据集中,我不是计算每列的前两行,而是计算每个月的天数。这意味着1月的前31行、2月的前28行、12月的前31行、1月的下31行等等。。。以上内容可以修改吗?@DJ-AFC您能否展示至少2个月的数据和预期输出,以了解数据的排列方式?谢谢@akrun。现在,我用一个更合适的例子编辑了这个问题。@DJ-AFC如果文件对象名为“JAN”、“FEB”等,unlist(lappy(mget(toupper(month.abb)),“[”,2))
Correct@akrun。共有12个数据集-每个月一个。每个数据集都有一个重复值,表示该月的总天数(例如1月31日,2月28日等[顺便说一句,没有闰年])如我的示例所示。每个数据集中有120个月的重复值,例如,Jan开始时重复了70次31次,然后又重复了119次31次。其他月份也一样,只是重复的天数是该月的天数。这是一个很好的解决方案@akrun。感谢提供。还有一个问题:在我的真实数据集中,我不是取每列的前2行,而是取每个月的天数。这意味着取1月的前31行,然后是2月的前28行等,直到12月的前31行,然后是1月的下31行等。可以修改上述内容吗?@DJ-AFC你能显示至少2个月吗f数据和预期输出以了解数据是如何排列的?谢谢@akrun。我现在用一个更合适的例子编辑了这个问题,说明我在寻找什么。@DJ-AFC如果文件对象名为“JAN”、“FEB”等,unlist(lappy(mget(toupper(month.abb)),“[”,2))
Correct@akrun。共有12个数据集-每个月一个。每个数据集都有一个该月总天数的重复值(例如,1月31日,2月28日等[顺便说一句,没有闰年])如我的示例所示。每个数据集中有120个月的重复值,例如,一月份开始时重复70次31次,然后又有119个值重复31次。其他月份也是如此,但重复的天数不同。