R 如何通过仅选择原始列的偶数行来创建另一列?

R 如何通过仅选择原始列的偶数行来创建另一列?,r,dataframe,R,Dataframe,这是我的数据帧: df = data.frame(Column1 = c(0.6356695,0.8892128,1.6114966,1.8713276,1.8060065,2.2590467,1.9850608,2.8007610,1.5946618,2.7254078,0.4813844,1.8026726,0.3588233,1.3347234)) Column1 1 0.6356695 2 0.8892128 3 1.6114966 4 1.8713276 5 1.80

这是我的数据帧:

 df = data.frame(Column1 = c(0.6356695,0.8892128,1.6114966,1.8713276,1.8060065,2.2590467,1.9850608,2.8007610,1.5946618,2.7254078,0.4813844,1.8026726,0.3588233,1.3347234))

  Column1
1  0.6356695
2  0.8892128
3  1.6114966
4  1.8713276
5  1.8060065
6  2.2590467
7  1.9850608
8  2.8007610
9  1.5946618
10 2.7254078
11 0.4813844
12 1.8026726
13 0.3588233
14 1.3347234
我想创建另一列,只从Column12、4、6、…、14中提取偶数行,同时从Column1中删除这些行

最终输出应如下所示:

    Column1     Column2 
1  0.6356695    0.8892128
2  1.6114966    1.8713276
3  1.8060065    2.2590467
4  1.9850608    2.8007610
5  1.5946618    2.7254078
6 0.4813844    1.8026726
7 0.3588233    1.3347234

我分几个步骤做了这件事,但我相信你们中的一些人可以做得更紧凑、更有效。我自己也尝试过一次使用mutate,但没有成功

非常感谢

1逻辑循环我们可以利用逻辑循环的事实:

data.frame(Column1 = df[c(TRUE, FALSE), ], Column2 = df[c(FALSE, TRUE), ])
给予:

    Column1   Column2
1 0.6356695 0.8892128
2 1.6114966 1.8713276
3 1.8060065 2.2590467
4 1.9850608 2.8007610
5 1.5946618 2.7254078
6 0.4813844 1.8026726
7 0.3588233 1.3347234
这也可以写成:

data.frame(Column1 = df[!0:1, ], Column2 = df[!1:0, ])
2重塑矩阵另一种方法是将列重塑为矩阵:

nms <- c("Column1", "Column2")
m <- matrix(df$Column1,, 2, byrow = TRUE, dimnames = list(NULL, nms))
as.data.frame(m)
4嵌入我们可以将嵌入的输出操作到所需的表单中。nms是从2

library(zoo)

r <- rollapply(df$Column1, 2, by = 2, c)
setNames(as.data.frame(r), nms)
e <- embed(df$Column1, 2)[c(TRUE, FALSE), 2:1]
setNames(as.data.frame(e), nms)
1逻辑循环我们可以利用逻辑循环的事实:

data.frame(Column1 = df[c(TRUE, FALSE), ], Column2 = df[c(FALSE, TRUE), ])
给予:

    Column1   Column2
1 0.6356695 0.8892128
2 1.6114966 1.8713276
3 1.8060065 2.2590467
4 1.9850608 2.8007610
5 1.5946618 2.7254078
6 0.4813844 1.8026726
7 0.3588233 1.3347234
这也可以写成:

data.frame(Column1 = df[!0:1, ], Column2 = df[!1:0, ])
2重塑矩阵另一种方法是将列重塑为矩阵:

nms <- c("Column1", "Column2")
m <- matrix(df$Column1,, 2, byrow = TRUE, dimnames = list(NULL, nms))
as.data.frame(m)
4嵌入我们可以将嵌入的输出操作到所需的表单中。nms是从2

library(zoo)

r <- rollapply(df$Column1, 2, by = 2, c)
setNames(as.data.frame(r), nms)
e <- embed(df$Column1, 2)[c(TRUE, FALSE), 2:1]
setNames(as.data.frame(e), nms)
使用“取消堆栈”的方法:

使用“取消堆栈”的方法:

另一种基本的可能性是:

setNames(cbind.data.frame(split(df, 1:nrow(df) %% 2 == 0)), 
         c("Column1", "Column2"))

     Column1   Column2
1  0.6356695 0.8892128
3  1.6114966 1.8713276
5  1.8060065 2.2590467
7  1.9850608 2.8007610
9  1.5946618 2.7254078
11 0.4813844 1.8026726
13 0.3588233 1.3347234
另一种基本的可能性是:

setNames(cbind.data.frame(split(df, 1:nrow(df) %% 2 == 0)), 
         c("Column1", "Column2"))

     Column1   Column2
1  0.6356695 0.8892128
3  1.6114966 1.8713276
5  1.8060065 2.2590467
7  1.9850608 2.8007610
9  1.5946618 2.7254078
11 0.4813844 1.8026726
13 0.3588233 1.3347234

哇!从来没有见过这个,美丽的代码。非常感谢!如果SO允许,我会将其标记为正确。哇!从来没有见过这个,美丽的代码。非常感谢!如果SO允许,我会将其标记为正确。所有答案都非常好。我学到了很多。谢谢大家。我记下了第一个评论的人,但你们都应该得到比我多得多的分数。谢谢你的帮助!所有的答案都很好。我学到了很多。谢谢大家。我记下了第一个评论的人,但你们都应该得到比我多得多的分数。谢谢你的帮助!