Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将一个数据帧中n行的子集绑定到多个其他数据帧中不同n行的子集_R - Fatal编程技术网

R 将一个数据帧中n行的子集绑定到多个其他数据帧中不同n行的子集

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

我试图通过一个大型数据集,将一个数据帧中的行子集重复绑定到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       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次。其他月份也是如此,但重复的天数不同。