2013-04-23 77 views
2

我有一個由3D中點的座標組成的data.frame。對於4個可能的點A1,A2,A3,A4,有4 x 3列。在每一行中,都有兩個非零點(A1 ... A4中的任意兩個)。我想知道是否可以在不使用循環的情況下將非零三元組提取到新的data.frame中。從data.frame中提取子集

原始data.frame:

df<-data.frame(
rbind(
c(0,0,0,1,2,3,0,0,0,5,4,1), 
c(1,2,2,1,2,3,0,0,0,0,0,0), 
c(0,0,0,0,0,0,2,1,1,5,4,1), 
c(0,0,0,1,3,1,2,1,1,0,0,0) 
)) 
colnames(df) <- c("x1","y1","z1","x2","y2","z2","x3","y3","z3","x4","y4","z4") 

我想要什麼:

df2<-data.frame(
rbind(
c(1,2,3,5,4,1), 
c(1,2,2,1,2,3), 
c(2,1,1,5,4,1), 
c(1,3,1,1,2,3) 
)) 
colnames(df2) <- c("x5","y5","z5","x6","y6","z6") 

感謝

+0

當你的意思是兩個非零分,可他們是(5,4,0)?或者他們將永遠不會是零?例如:這可能發生嗎? 'c(0,0,0,1,2,3,0,0,5,4,0)'? – Arun 2013-04-23 10:11:22

+0

他們永遠不會有零組件 – mira 2013-04-23 10:39:22

回答

3

一個簡單的方法是隻使用apply,但在技術上,這是仍然使用一個循環。

t(apply(df, 1, function(x) x[x > 0])) 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 2 3 5 4 1 
[2,] 1 2 2 1 2 3 
[3,] 2 1 1 5 4 1 
[4,] 1 3 1 2 1 1 

你需要做(微小)多做一些工作,以將其轉換爲data.frame,並添加列名。


沒有一個循環,你可以使用這樣的:例如

data.frame(matrix(df[df != 0], nrow = nrow(df))) 
# X1 X2 X3 X4 X5 X6 
# 1 1 1 3 2 1 4 
# 2 2 1 3 2 1 4 
# 3 2 2 3 1 5 1 
# 4 1 2 1 1 5 1 
+0

謝謝,它的工作原理! – mira 2013-04-23 10:45:28