2014-02-18 70 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)) 

還有其他的問題,比如你可能結合不同列在一起,這將是沒有意義的,如果他們有不同類別的項目。但是你沒有提到這是一個問題,所以我會假設你的數據框實際上更類似於這種操作更明智的矩陣。