2013-12-20 44 views
1

我遇到了一個R編程問題,我似乎無法包住我的頭。我有如下所示的數據:在數據框中查找相交條目

data = data.frame("start"=c(1,2,4,5), 
        "length"=c(2,2,2,3), 
        "decision"=c("yes","no","yes","yes")) 

看起來像:

start length decision 
1  1  2  yes 
2  2  2  no 
3  4  2  yes 
4  5  3  yes 

行一個代表該從1開始爲長度2(1,2)的整數序列。第3行是從4(4,5)開始的2個整數。我正在尋找具有「是」決策變量的條目之間的交集。當決策變量爲「否」時,則序列被拋出。這是我迄今爲止所嘗試的。

我想我需要先創建一個序列表。

sequence.list = lapply(seq(dim(data)[1]), 
         function(d){ 
         seq(data$start[d],(data$start[d]+data$length[d]-1),by=1) 
         }) 

此輸出:

sequence.list 
[[1]] 
[1] 1 2 

[[2]] 
[1] 2 3 

[[3]] 
[1] 4 5 

[[4]] 
[1] 5 6 7 

這是一個開始。然後我創建一個列表,列出我列表中的項目之間的交集(我從這裏的另一篇文章偷走了這個想法)。

count.intersect = lapply(sequence.list,function(a) { 
    sapply(seq(length(sequence.list)), 
     function(b) length(intersect(sequence.list[[b]], a))) 
    }) 

這種方式建立列表:

count.intersect 
[[1]] 
[1] 2 1 0 0 

[[2]] 
[1] 1 2 0 0 

[[3]] 
[1] 0 0 2 1 

[[4]] 
[1] 0 0 1 3 

讀取這是在數據幀的條目1具有2個本身瑣碎交叉點和1個交點與條目2.

這裏的方式我在哪裏做模糊。讓它成爲矩陣?

intersect.matrix = do.call(rbind,count.intersect) 

然後將未使用的條目的行和列設置爲零?

intersect.matrix[,data$decision=="no"]=0 
intersect.matrix[data$decision=="no",]=0 

intersect.matrix 
    [,1] [,2] [,3] [,4] 
[1,] 2 0 0 0 
[2,] 0 0 0 0 
[3,] 0 0 2 1 
[4,] 0 0 1 3 

現在,我想以某種方式返回索引3和4。我想查找包含非零的行(或列),這些零也不在對角線上。

對不起張貼整個過程,我也想知道是否有一個從起始數據框到在使用條目中找到交點的較短路。

回答

0

既然你是在對角線上的非零值不感興趣,我首先減去他們去

diag.mat <- diag(intersect.matrix) * diag(ncol(intersect.matrix) 

這給:

intersect.matrix - diag.mat 
    [,1] [,2] [,3] [,4] 
[1,] 0 0 0 0 
[2,] 0 0 0 0 
[3,] 0 0 0 1 
[4,] 0 0 1 0 

然後確定哪些列仍持有非零條目使用which

which(colSums(intersect.matrix - diag.mat) != 0) 
[1] 3 4 
0

您問是否有短的wa y從您的數據框data轉到索引。這裏是。

(注意:如果您是R的新手,這可能很難理解。)

1)創建的序列列表:

sequence.list <- apply(data[1:2], 1, function(x) seq_len(x[2]) + x[1] - 1) 
# [[1]] 
# [1] 1 2 
# 
# [[2]] 
# [1] 2 3 
# 
# [[3]] 
# [1] 4 5 
# 
# [[4]] 
# [1] 5 6 7 

2)計數相交併創建對應於"no"的交叉矩陣

intersect.matrix <- outer(s <- seq_along(sequence.list), s, 
          Vectorize(function(a, b) 
          length(Reduce(intersect, sequence.list[seq(a, b)])))) 
#  [,1] [,2] [,3] [,4] 
# [1,] 2 1 0 0 
# [2,] 1 2 0 0 
# [3,] 0 0 2 1 
# [4,] 0 0 1 3 

3)設置細胞爲零

idx <- data$decision == "no" 
intersect.matrix[idx, ] <- intersect.matrix[ , idx] <- 0 
#  [,1] [,2] [,3] [,4] 
# [1,] 2 0 0 0 
# [2,] 0 0 0 0 
# [3,] 0 0 2 1 
# [4,] 0 0 1 3 

4)查找非零行/列的索引(對角線除外)

result <- which(as.logical(colSums("diag<-"(intersect.matrix, 0)))) 
# [1] 3 4 
+0

@nfmcclure對。我糾正了它,並且省略了上面的行中的「哪個」。 –