从data.frame中提取子集

时间:2013-04-23 10:04:10

标签: r dataframe subset

我有一个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")

由于

1 个答案:

答案 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