从data.frame中提取子集

从data.frame中提取子集,r,dataframe,subset,R,Dataframe,Subset,我有一个data.frame,由3D中的点坐标组成。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,

我有一个data.frame,由3D中的点坐标组成。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")

df一个简单的方法是只使用
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

当你指的是两个非零点时,它们可以是(5,4,0)吗?或者它们永远不会是零?这会发生吗<代码>c(0,0,0,1,2,3,0,0,0,0,5,4,0)
?它们永远不会有零分量
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