将 R 中的列移动到其他三个的底部
Move columns in R at the bottom of other three
我正在努力移动数据框的列,实际上我不确定是否真的可以做我正在寻找的事情。无论如何,我有一个六列的数据框,我想把它变成三列,将最后三列移动到前三列的底部。
下面我报告Data frame的代码:
Dati <- data.frame("Vix" = c(62500, 87000, 122000, 140000, 154000), "monomer" = c(1.25,2.10,2.99,4.05,5.55), "Time" = c(30,60,90,120,135), "Vix2" = c(625000, 87000, 1220000, 1400000, 1540000), "monomer2" = c(1.205,2.100,2.909,4.005,5.505), "Time2" = c(300,60,900,1200,1035))
attach(Dati)
library(ggplot2)
编数字只是为了让例子更清楚。
我的目标是从这个改变数据框:
对此:
有人知道如何使用 R 代码制作这个吗?
预先感谢您的每一次最终支持!
试试 tidyr::pivot_longer
:
tidyr::pivot_longer(Dati, cols = everything(),
names_to = '.value',
names_pattern = '([A-Za-z]+)\d?')
# Vix monomer Time
# <dbl> <dbl> <dbl>
# 1 62500 1.25 30
# 2 625000 1.20 300
# 3 87000 2.1 60
# 4 87000 2.1 60
# 5 122000 2.99 90
# 6 1220000 2.91 900
# 7 140000 4.05 120
# 8 1400000 4.00 1200
# 9 154000 5.55 135
#10 1540000 5.50 1035
另一种方法是 rbind
:
首先拆分为两个数据帧 Dati1
Dati2
,并在 Dati2
中分配相同的名称
然后 rbind
library(dplyr)
Dati1 <- Dati %>%
select(-contains("2"))
Dati2 <- Dati %>%
select(Vix=Vix2, monomer = monomer2, Time=Time2)
rbind(Dati1, Dati2)
输出:
Vix monomer Time
1 62500 1.250 30
2 87000 2.100 60
3 122000 2.990 90
4 140000 4.050 120
5 154000 5.550 135
6 625000 1.205 300
7 87000 2.100 60
8 1220000 2.909 900
9 1400000 4.005 1200
10 1540000 5.505 1035
基础 R 解决方案:
# Resolve the vector names required: required_vecs => character vector
required_vecs <- unique(gsub("\d+$", "", names(Dati)))
# Split-Apply-Combine data: data.frame => stdout(console)
do.call(cbind, lapply(required_vecs, function(x){
# Subset the data to only contain relevant vectors: sbst => data.frame
sbst <- Dati[,grepl(x, names(Dati))]
# Split each column (of the same data) into a data.frame in a list:
# same_vecs => list of data.frames
same_vecs <- split.default(sbst, seq_len(ncol(sbst)))
# Rename the data.frames as required and row-bind them into a single df:
# data.frame => GlobalEnv()
do.call(rbind, Map(function(y){setNames(y, x)}, same_vecs))
}
)
)
我正在努力移动数据框的列,实际上我不确定是否真的可以做我正在寻找的事情。无论如何,我有一个六列的数据框,我想把它变成三列,将最后三列移动到前三列的底部。
下面我报告Data frame的代码:
Dati <- data.frame("Vix" = c(62500, 87000, 122000, 140000, 154000), "monomer" = c(1.25,2.10,2.99,4.05,5.55), "Time" = c(30,60,90,120,135), "Vix2" = c(625000, 87000, 1220000, 1400000, 1540000), "monomer2" = c(1.205,2.100,2.909,4.005,5.505), "Time2" = c(300,60,900,1200,1035))
attach(Dati)
library(ggplot2)
编数字只是为了让例子更清楚。
我的目标是从这个改变数据框:
对此:
有人知道如何使用 R 代码制作这个吗? 预先感谢您的每一次最终支持!
试试 tidyr::pivot_longer
:
tidyr::pivot_longer(Dati, cols = everything(),
names_to = '.value',
names_pattern = '([A-Za-z]+)\d?')
# Vix monomer Time
# <dbl> <dbl> <dbl>
# 1 62500 1.25 30
# 2 625000 1.20 300
# 3 87000 2.1 60
# 4 87000 2.1 60
# 5 122000 2.99 90
# 6 1220000 2.91 900
# 7 140000 4.05 120
# 8 1400000 4.00 1200
# 9 154000 5.55 135
#10 1540000 5.50 1035
另一种方法是 rbind
:
首先拆分为两个数据帧 Dati1
Dati2
,并在 Dati2
中分配相同的名称
然后 rbind
library(dplyr)
Dati1 <- Dati %>%
select(-contains("2"))
Dati2 <- Dati %>%
select(Vix=Vix2, monomer = monomer2, Time=Time2)
rbind(Dati1, Dati2)
输出:
Vix monomer Time
1 62500 1.250 30
2 87000 2.100 60
3 122000 2.990 90
4 140000 4.050 120
5 154000 5.550 135
6 625000 1.205 300
7 87000 2.100 60
8 1220000 2.909 900
9 1400000 4.005 1200
10 1540000 5.505 1035
基础 R 解决方案:
# Resolve the vector names required: required_vecs => character vector
required_vecs <- unique(gsub("\d+$", "", names(Dati)))
# Split-Apply-Combine data: data.frame => stdout(console)
do.call(cbind, lapply(required_vecs, function(x){
# Subset the data to only contain relevant vectors: sbst => data.frame
sbst <- Dati[,grepl(x, names(Dati))]
# Split each column (of the same data) into a data.frame in a list:
# same_vecs => list of data.frames
same_vecs <- split.default(sbst, seq_len(ncol(sbst)))
# Rename the data.frames as required and row-bind them into a single df:
# data.frame => GlobalEnv()
do.call(rbind, Map(function(y){setNames(y, x)}, same_vecs))
}
)
)