R子集数据帧由两个向量组成

时间:2014-02-18 17:25:14

标签: r dataframe

我有一个数据框和两个名为leftright的整数向量。

我想创建一个数据框的子集,使得向量中的数字将指示要包含在子集中的列的范围。

例如,对于数据框中的第n行,我想保留这些值 df[n,left[n]:right[n]。 我尝试使用mapply()

这样做
aligned_rows<-apply(df,1,
                function(x) mapply(function(y,z)x[y:z], left, right))

但得到的输出没有任何意义。

3 个答案:

答案 0 :(得分:2)

这个命令可以解决问题:

as.data.frame(t(mapply(function(x,y,z) df[x,y:z],
                       x=seq_len(nrow(df)),y=left,z=right)))

以下是一个例子:

set.seed(10)
df <- data.frame(replicate(8,runif(4)))

#    X1    X2    X3    X4    X5    X6    X7    X8
#  0.51  0.09  0.62  0.11  0.05  0.86  0.41  0.77
#  0.31  0.23  0.43  0.60  0.26  0.62  0.71  0.36
#  0.43  0.28  0.65  0.36  0.40  0.78  0.84  0.54
#  0.69  0.27  0.57  0.43  0.84  0.36  0.24  0.09

申请

left <- c(1,3,5,7)
right <- c(2,4,6,8)
as.data.frame(t(mapply(function(x,y,z) df[x,y:z],
                       x=seq_len(nrow(df)),y=left,z=right)))

产量

#    X1    X2
#  0.51  0.09
#  0.43  0.60
#  0.40  0.78
#  0.24  0.09

为了实现这一点,leftright定义的每个范围必须包含相同数量的元素。此外,leftright必须包含与df中的行一样多的元素。

答案 1 :(得分:0)

如上所述问题尚不清楚,希望下面的例子会给出一些提示:

#dummy data
df <- data.frame(matrix(runif(20,1,50),nrow=4))

#right left dummy
right <- c(1,3,4)
left <- c(5,4,5)

#nth value, also try n <- c(2,4) to get 2nd and 4th rows
n <- 2

#return list of data.frames
lapply(1:length(right),
       function(x) df[n,right[x]:left[x]])

答案 2 :(得分:0)

如果没有更多信息,您的问题是不适合的,因为无法保证每行中您想要的项目数量是相同的。请记住,数据框是一个矩形对象,即所有行必须具有相同的长度。

获得更合理的是列表,它没有此限制:

mapply(function(l, r) df[, l:r], left, right, SIMPLIFY=FALSE)

假设每行产生相同数量的项目,您可以将它们与rbind结合使用:

do.call(rbind, mapply(function(l, r) df[, l:r], left, right, SIMPLIFY=FALSE))

还有其他问题,例如,您可能将来自不同列的项目组合在一起,如果它们具有不同的类,那将是无意义的。但你没有提到这个问题,所以我假设你的数据框架更像是一种矩阵,这种操作更为明智。