将 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))
    }
  )
)