2017-09-13 171 views
-1

我有多個包含未知(和可變)列數的數據幀(總是2的倍數)。該文件的標題,看起來像:將每兩列的數據幀拆分爲多個數據幀

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

一對的列包含相同數目的行,但行的數量爲非配對柱之間的不同。

使用R,我想在狹縫多個小一個僅包含成對的列,這些數據幀:

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

成:

X0, Y0 
X1, Y1 
X2, Y2 

等。

我試圖設置循環,但沒有成功到目前爲止。

任何人都可以指出我正確的方向來解決這個問題嗎?

非常感謝。

+0

對於行數據缺失的列,是否還存在分隔符?我甚至不知道如何將這些文件讀入R. –

+0

「每個配對的列包含相同數量的行,但行數在非配對列之間不同。」這怎麼可能呢? data.frame字面上不能有列數不均勻的行。一個完整的,可重複的例子顯示你正在處理的事情會使這個更清晰。 – thelatemail

回答

1
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 

數據:

dput(df) 
structure(list(X0 = c(1L, 11L, 21L, 31L, 41L), Y0 = c(2L, 12L, 
22L, 32L, 42L), X1 = c(3L, 13L, 23L, 33L, 43L), Y1 = c(4L, 14L, 
24L, 34L, 44L), X2 = c(5L, 15L, 25L, 35L, 45L), Y2 = c(6L, 16L, 
26L, 36L, 46L), X3 = c(7L, 17L, 27L, 37L, 47L), Y3 = c(8L, 18L, 
28L, 38L, 48L), X4 = c(9L, 19L, 29L, 39L, 49L), Y4 = c(10L, 20L, 
30L, 40L, 50L)), .Names = c("X0", "Y0", "X1", "Y1", "X2", "Y2", 
"X3", "Y3", "X4", "Y4"), class = "data.frame", row.names = c(NA, 
-5L)) 
+0

完美的工作!很多謝謝..現在好了一個愚蠢的問題。如何將列表轉換爲單獨的數據框? –

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 
+0

Err:找不到功能「地圖」...我相信你的意思是來自purr的地圖? –

+0

當然可以。我認爲咕嚕聲是一種純粹的... –

+0

是的!我只有'tidyr',並將其誤認爲是。解決方案應該沒問題! –

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