2013-04-23 5 views
2

У меня есть data.frame, состоящий из координат точек в 3D. Существует 4 x 3 столбца для 4 возможных точек A1, A2, A3, A4. В каждой строке есть ровно две ненулевые точки (любые два из A1 ... A4). Мне было интересно, можно ли извлечь ненулевые триплеты в новый data.frame без использования циклов.extract subset from 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, 0, 5, 4, 0)'? – Arun

+0

у них никогда не будет нулевого компонента – mira

ответ

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