2014-02-18 143 views
1

我有一个数据帧和两个名为leftright的整数向量。由两个向量构成的R子集数据帧

我想创建一个数据框的子集,以便向量中的数字表示要包含在子集中的列的范围。

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

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

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

+2

完全根据您的描述很难说出您要达到的目标。你可以提供一个简单的例子* *之前的*和*之后的数据*? ....特别是,你想要得到的结果并不清楚:矩阵,向量列表,数据帧,其他东西? – Jealie

+0

假设我有一个数据帧df <-as.data.frame(matrix(seq(10),nrow = 2,byrow = TRUE); left <-c(2,4); right <-c(3,5 );我想获得一个数据框,使得:subset <-rbind(as.numeric(a [1,left [1]:right [1]]),as.numeric(a [2,left [2]:对[2]])) – user1614062

回答

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中的行一样多的元素。

+0

谢谢,它绝对做到了这一招 – user1614062

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]]) 
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)) 

还有其他的问题,比如你可能结合不同列在一起,这将是没有意义的,如果他们有不同类别的项目。但是你没有提到这是一个问题,所以我会假设你的数据框实际上更类似于这种操作更明智的矩阵。