2

我有一个由 3D 点坐标组成的 data.frame。4 个可能的点 A1、A2、A3、A4 有 4 x 3 列。在每一行中,恰好有两个非零点(A1...A4 中的任意两个)。我想知道是否可以在不使用循环的情况下将非零三元组提取到新的 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")

谢谢

4

1 回答 1

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

您需要做一些(微小的)工作才能将其转换为 adata.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
于 2013-04-23T10:09:30.940 回答