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允许,我会将其标记为正确。所有答案都非常好。我学到了很多。谢谢大家。我记下了第一个评论的人,但你们都应该得到比我多得多的分数。谢谢你的帮助!所有的答案都很好。我学到了很多。谢谢大家。我记下了第一个评论的人,但你们都应该得到比我多得多的分数。谢谢你的帮助!