2017-01-02 95 views
1

我有四列的數據幀,並希望將其與2列的變換的數據幀,但序列事項(所以堆棧或不具有額外的排序合併不是一個選項)更優雅方法的嵌入行

X1 Y1 X2 Y2 
1 2 3 4 
5 6 7 8 

X1 Y1 
1 2 
3 4 
5 6 
7 8 

我的醜版本:

nrow = 4 
# Test data set 
d = setNames(data.frame(matrix(sample(1:(nrow*4)), nrow=nrow)), 
      c("X1","Y1","X2","Y2"))d 

# Create empty data frame 
d1 = data.frame(matrix(rep(NA, nrow*2*2), nrow = nrow*2)) 
# Elements 1, 3, 5... 
d1[seq(1, nrow*2, by = 2),] = d[,1:2] 
# Elements 2, 4, 6... 
d1[seq(2, nrow*2, by = 2),] = d[,3:4] 

沒必要基地R.

後來補充:我剛剛發現:

data.frame(matrix(as.vector(t(as.matrix(d))), nrow = 2*nrow, byrow = TRUE)) 

但像@akrun有它

由@alistaire提到的職位的替代解決方案略微簡化版本,例如使用reshape看起來,顯然不比我的原始版本更優雅。

+0

我沒有找到那個,但那裏提出的解決方案比我的原始解決方案要複雜得多。我試圖避免關鍵詞「合併」,並使用我的DNA研究過去的「插入」。 –

回答

2

如果「X」和「Y」的列是交替的,那麼,我們轉置數據集,將其轉換爲matrix通過指定除以2原始數據集的列數並轉換爲data.frame

as.data.frame(matrix(t(df1), ncol= ncol(df1)/2, byrow=TRUE, 
           dimnames = list(NULL, c("X1", "Y1")))) 
# X1 Y1 
#1 1 2 
#2 3 4 
#3 5 6 
#4 7 8 

或者使用meltdata.table,我們可以採取多種measurepatterns基於列名轉換爲「長」格式

library(data.table) 
melt(setDT(df1), measure = patterns("^X", "^Y"), 
     value.name = c("X1", "Y1"))[, variable := NULL][order(X1)] 
# X1 Y1 
#1: 1 2 
#2: 3 4 
#3: 5 6 
#4: 7 8