每 5 行(一个数字间隔)将一列转换为一个新列
Convert one column into a new column every 5 rows (a numeric interval)
我有一个很长的专栏,其中包含大量分析结果(作为 .txt 文件,我将使用 R 阅读)。从顶部开始,前 5 行是对应于 Sample1 的结果,第二组 5 行(第 6、7、8、9 和 10 行)对应于 Sample2,依此类推,从 Sample1 到 Sample57。所以,我想把那个长列分成 57 列,按样本分开。
让我们从一个更小的例子开始来简化问题,只使用前两个样本(因此,该列只有 10 个值,每个 5 个)。假设我们有这个列向量:
0.01
0.02
0.45
0.34
0.55
0.78
0.08
0.49
0.50
0.33
而且我知道前 5 个数字对应于 Sample1,第二个对应于 Sample2。我想这样做:
0.01 0.78
0.02 0.08
0.45 0.49
0.34 0.50
0.55 0.33
总的来说,我想将该柱状向量转换为一个矩阵,其中每列长 5 行,并且这些数字的顺序与它们在原始向量中的顺序相同。就好像你把原来的向量切成5行长的片段,然后按顺序粘贴在右边。我搜索了将一列拆分为多列的命令,但它们使用的是识别字符模式的东西。这是一个不同的场景。
我还发现了关于终端 Put every N rows of input into a new column 的这个,但我想知道 R 中是否有办法做到这一点,也许也更简单。
有没有办法严格每 5 行执行一次?
是的,您可以执行以下操作:
as.data.frame(split(data, 1:x))
其中 x = 行数 / 5;在你的例子中 x = 2 因为你有 10 个观察
我们可以使用matrix
来构造这个
matrix(df1[,1], nrow=5, ncol=2)
# [,1] [,2]
#[1,] 0.01 0.78
#[2,] 0.02 0.08
#[3,] 0.45 0.49
#[4,] 0.34 0.50
#[5,] 0.55 0.33
如果行数不是 5 的倍数,则使用 tidyverse
中的 spread
或 data.table
中的 dcast
(reshape2
)
library(tidyverse)
df1 %>%
mutate(i1 = rep(1:5, length.out=n()), grp = paste0("Col", cumsum(i1==1))) %>%
spread(grp, Col1) %>%
select(-i1)
# Col1 Col2
#1 0.01 0.78
#2 0.02 0.08
#3 0.45 0.49
#4 0.34 0.50
#5 0.55 0.33
数据
df1 <- structure(list(Col1 = c(0.01, 0.02, 0.45, 0.34, 0.55, 0.78, 0.08,
0.49, 0.5, 0.33)), .Names = "Col1", class = "data.frame", row.names = c(NA,
-10L))
我有一个很长的专栏,其中包含大量分析结果(作为 .txt 文件,我将使用 R 阅读)。从顶部开始,前 5 行是对应于 Sample1 的结果,第二组 5 行(第 6、7、8、9 和 10 行)对应于 Sample2,依此类推,从 Sample1 到 Sample57。所以,我想把那个长列分成 57 列,按样本分开。 让我们从一个更小的例子开始来简化问题,只使用前两个样本(因此,该列只有 10 个值,每个 5 个)。假设我们有这个列向量:
0.01
0.02
0.45
0.34
0.55
0.78
0.08
0.49
0.50
0.33
而且我知道前 5 个数字对应于 Sample1,第二个对应于 Sample2。我想这样做:
0.01 0.78
0.02 0.08
0.45 0.49
0.34 0.50
0.55 0.33
总的来说,我想将该柱状向量转换为一个矩阵,其中每列长 5 行,并且这些数字的顺序与它们在原始向量中的顺序相同。就好像你把原来的向量切成5行长的片段,然后按顺序粘贴在右边。我搜索了将一列拆分为多列的命令,但它们使用的是识别字符模式的东西。这是一个不同的场景。 我还发现了关于终端 Put every N rows of input into a new column 的这个,但我想知道 R 中是否有办法做到这一点,也许也更简单。
有没有办法严格每 5 行执行一次?
是的,您可以执行以下操作:
as.data.frame(split(data, 1:x))
其中 x = 行数 / 5;在你的例子中 x = 2 因为你有 10 个观察
我们可以使用matrix
来构造这个
matrix(df1[,1], nrow=5, ncol=2)
# [,1] [,2]
#[1,] 0.01 0.78
#[2,] 0.02 0.08
#[3,] 0.45 0.49
#[4,] 0.34 0.50
#[5,] 0.55 0.33
如果行数不是 5 的倍数,则使用 tidyverse
中的 spread
或 data.table
中的 dcast
(reshape2
)
library(tidyverse)
df1 %>%
mutate(i1 = rep(1:5, length.out=n()), grp = paste0("Col", cumsum(i1==1))) %>%
spread(grp, Col1) %>%
select(-i1)
# Col1 Col2
#1 0.01 0.78
#2 0.02 0.08
#3 0.45 0.49
#4 0.34 0.50
#5 0.55 0.33
数据
df1 <- structure(list(Col1 = c(0.01, 0.02, 0.45, 0.34, 0.55, 0.78, 0.08,
0.49, 0.5, 0.33)), .Names = "Col1", class = "data.frame", row.names = c(NA,
-10L))