将每两列的数据帧拆分为多个数据帧

时间:2017-09-13 05:52:30

标签: r dataframe split

我有多个包含未知(和可变)列数的数据帧(总是2的倍数)。文件的标题看起来像这样:

X0, Y0, X1, Y1, X2, Y2 ... Xn, Yn

每个配对列包含相同数量的行,但非配对列之间的行数不同。

使用R,我想将这些数据帧切换为仅包含配对列的多个小数据框:

X0, Y0, X1, Y1, X2, Y2,... Xn, Yn

成:

X0, Y0
X1, Y1
X2, Y2

等等。

我尝试设置循环但到目前为止没有成功。

有人能指出我正确的方向/方法来解决这个问题吗?

非常感谢。

3 个答案:

答案 0 :(得分:1)

if "$(VisualStudioVersion)" == "12.0" (echo "This command line come from VS 2013!")

if "$(VisualStudioVersion)" == "15.0" (echo "This command line come from VS 2017!")

数据:

lapply(seq(1, ncol(df), by=2), function(i) 
     df[i: pmin((i+1), ncol(df))])

[[1]]
  X0 Y0
1  1  2
2 11 12
3 21 22
4 31 32
5 41 42

[[2]]
  X1 Y1
1  3  4
2 13 14
3 23 24
4 33 34
5 43 44

[[3]]
  X2 Y2
1  5  6
2 15 16
3 25 26
4 35 36
5 45 46

[[4]]
  X3 Y3
1  7  8
2 17 18
3 27 28
4 37 38
5 47 48

[[5]]
  X4 Y4
1  9 10
2 19 20
3 29 30
4 39 40
5 49 50

答案 1 :(得分:1)

tidyverse解决方案:

library(tidyverse)

 set.seed(123)

 dt<-data.frame(
  X0=rnorm(5),
  Y0=rnorm(5),
  X1=c(rnorm(4),NA),
  Y1=c(rnorm(4),NA),
  X2=c(rnorm(3),NA,NA),
  Y2=c(rnorm(3),NA,NA)
 )

 dt
           X0         Y0        X1         Y1         X2         Y2
1 -0.56047565  1.7150650 1.2240818 -0.5558411  0.7013559 -0.2179749
2 -0.23017749  0.4609162 0.3598138  1.7869131 -0.4727914 -1.0260044
3  1.55870831 -1.2650612 0.4007715  0.4978505 -1.0678237 -0.7288912
4  0.07050839 -0.6868529 0.1106827 -1.9666172         NA         NA
5  0.12928774 -0.4456620        NA         NA         NA         NA

 seq(2,ncol(dt),2) %>%   map(~ select(dt,(.-1):.))
[[1]]
           X0         Y0
1 -0.56047565  1.7150650
2 -0.23017749  0.4609162
3  1.55870831 -1.2650612
4  0.07050839 -0.6868529
5  0.12928774 -0.4456620

[[2]]
         X1         Y1
1 1.2240818 -0.5558411
2 0.3598138  1.7869131
3 0.4007715  0.4978505
4 0.1106827 -1.9666172
5        NA         NA

[[3]]
          X2         Y2
1  0.7013559 -0.2179749
2 -0.4727914 -1.0260044
3 -1.0678237 -0.7288912
4         NA         NA
5         NA         NA

答案 2 :(得分:1)

另一个lapply解决方案。

# Example data frame
dt <- data.frame(X0 = "a",
                 Y0 = "b",
                 X1 = "c",
                 Y1 = "d",
                 X2 = "e",
                 Y2 = "f",
                 stringsAsFactors = FALSE)

# Split the data frame
lapply(1:(ncol(dt)/2), function(x) dt[, c(2 * x - 1, 2 * x)])
[[1]]
  X0 Y0
1  a  b

[[2]]
  X1 Y1
1  c  d

[[3]]
  X2 Y2
1  e  f