2012-08-24 39 views
0

我有一些問題需要表達自己。也許,這就是爲什麼我沒有找到任何幫助我的東西。這個例子應該明確我想要的。 假設我有一個m×m的座標矩陣結構。可以說它的範圍從A1到E5。並且我想要將距離外部座標k行的行/列子集。基於邊界條件的數據框中的子集行和列

在我的例子中k是2.所以我想選擇數據框中所有具有座標B2,B3,B4,C2,C4,D2,D3,D4的記錄。手動,我會做以下幾點:

cc <- data.frame(x=(LETTERS[1:5]), y=c(rep(1,5),rep(2,5),rep(3,5), rep(4,5), rep(5,5)) , z=rnorm(25)) 
slct <- with(cc, which((x=="B" | x=="C" | x=="D") & (y==2 | y==3 | y==4) & !(x=="C" & y==3))) 
cc[slct,] # result data frame 

但是,如果矩陣的尺寸增加,這將不會很好的方式。任何更好的想法?

回答

2

相當難讀,但它的確有用。

m <- 5 # Matrix dimensions 
k <- 2 # The index of the the inner square that you want to extract 
cc[(cc$x %in% LETTERS[c(k,m-k+1)] & !cc$y %in% c(1:(k-1), m:(m-k+2))) | 
    (cc$y %in% c(k, m-k+1)   & !cc$x %in% LETTERS[c(1:(k-1), m:(m-k+2))]),] 

比較的第一行提取k:從第矩陣的左和右邊緣,但不能是比k靠近上邊緣和下邊緣的部分列。第二行對行進行同樣的操作。

+1

請注意,在'k == 1'的特殊情況下,您必須刪除%!'零件中的'!cc $ ...%,否則您將得到一個不正確的解決方案。爲了明確答案,我決定不單獨處理,但這是微不足道的補充。 – Backlin

2
cc$xy <- paste0(cc$x,cc$y) 

coords <- c("B2","B3","B4", "C2", "C4", "D2", "D3", "D4") 
cc[cc$xy %in% coords,] 

# x y   z xy 
#7 B 2 -0.9031472 B2 
#8 C 2 -0.1405147 C2 
#9 D 2 1.6017619 D2 
#12 B 3 1.7713041 B3 
#14 D 3 -0.2005749 D3 
#17 B 4 1.8671238 B4 
#18 C 4 0.3428815 C4 
#19 D 4 0.1470436 D4 
相關問題