我有一个data.frame,包含3D中的点坐标。 4个可能的点A1,A2,A3,A4有4 x 3列。在每一行中,恰好有两个非零点(A1 ... A4中的任意两个)。我想知道是否可以在不使用循环的情况下将非零三元组提取到新的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 :(得分: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
您需要执行 little (微小)更多工作才能将其转换为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