2014-02-06 29 views
0

大家好我是triying來解決R中的一個小問題。我有下一個數據幀(我在最後部分添加dput()版本) :在同一數據幀中考慮起始列連接到索引變量的行中元素數的計數

ID Index s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 
1 a  1 A A A A A A A A A A 
2 b  3 <NA> <NA> A A A A A A A A 
3 c  5 <NA> <NA> <NA> <NA> A A A A A A 
4 d  1 A A A A A A A A A A 
5 e  1 A A A A A A A A A A 
6 f  6 <NA> <NA> <NA> <NA> <NA> A A A A A 
7 g  6 <NA> <NA> <NA> <NA> <NA> A A A A A 
8 h  4 <NA> <NA> <NA> A A A A A A A 

以我數據幀TestIndex顯示在每行中的NA第一非ocurrence。現在我想爲新變量中的每一行計算A考慮這樣的列的數量:第一列將是第一個非NA發生的列,例如在bID的情況下它具有Index=3和I想要計算自此列以來的A直到4列後,在此情況下直到列s3+4=s7。這適用於所有行。我想獲得這樣的事:

ID Index s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 Count 
1 a  1 A A A A A A A A A A 5 
2 b  3 <NA> <NA> A A A A A A A A 5 
3 c  5 <NA> <NA> <NA> <NA> A A A A A A 5 
4 d  1 A A A A A A A A A A 5 
5 e  1 A A A A A A A A A A 5 
6 f  6 <NA> <NA> <NA> <NA> <NA> A A A A A 5 
7 g  6 <NA> <NA> <NA> <NA> <NA> A A A A A 5 
8 h  4 <NA> <NA> <NA> A A A A A A A 5 

我用這個代碼,但我得到了一個錯誤:

Test$Count=apply(Test[,c(-1,-2,Test$Index.Test$Index+4)] , 1 , function(x) length(which(!is.na(x) & x=="A"))) 

請你的幫助是值得歡迎的,在dput()版本我的數據幀是下一:

structure(list(ID = c("a", "b", "c", "d", "e", "f", "g", "h"), 
    Index = c(1, 3, 5, 1, 1, 6, 6, 4), s1 = c("A", NA, NA, "A", 
    "A", NA, NA, NA), s2 = c("A", NA, NA, "A", "A", NA, NA, NA 
    ), s3 = c("A", "A", NA, "A", "A", NA, NA, NA), s4 = c("A", 
    "A", NA, "A", "A", NA, NA, "A"), s5 = c("A", "A", "A", "A", 
    "A", NA, NA, "A"), s6 = c("A", "A", "A", "A", "A", "A", "A", 
    "A"), s7 = c("A", "A", "A", "A", "A", "A", "A", "A"), s8 = c("A", 
    "A", "A", "A", "A", "A", "A", "A"), s9 = c("A", "A", "A", 
    "A", "A", "A", "A", "A"), s10 = c("A", "A", "A", "A", "A", 
    "A", "A", "A")), .Names = c("ID", "Index", "s1", "s2", "s3", 
"s4", "s5", "s6", "s7", "s8", "s9", "s10"), row.names = c(NA, 
8L), class = "data.frame") 

非常感謝的。

回答

0

這裏有一個更簡單的方法:

mcol <- ncol(Test) - 2 
Test$Count <- sapply(seq(nrow(Test)), function(x) { 
    idx <- Test$Index[x] 
    idx2 <- seq(idx, min(idx + 4, mcol)) 
    sum(Test[x, -(1:2)][, idx2] == "A", na.rm = TRUE) 
}) 


    ID Index s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 Count 
1 a  1 A A A A A A A A A A  5 
2 b  3 <NA> <NA> A A A A A A A A  5 
3 c  5 <NA> <NA> <NA> <NA> A A A A A A  5 
4 d  1 A A A A A A A A A A  5 
5 e  1 A A A A A A A A A A  5 
6 f  6 <NA> <NA> <NA> <NA> <NA> A A A A A  5 
7 g  6 <NA> <NA> <NA> <NA> <NA> A A A A A  5 
8 h  4 <NA> <NA> <NA> A A A A A A A  5 
+0

謝謝@SvenHohenstein,但我不能確定A的數量,我可以有其他字母,如B,C等。我想數一數。 – Duck

+0

@Duck查看更新。 –

+0

親愛的@SvenHohenstein我正在使用其他類似的數據框,並且出現此錯誤:'錯誤en'[.data.frame'(Test [x, - (1:2)],,idx2): 未定義的列被選中。你能幫我嗎,我添加我的數據框在下一個鏈接:https://dl.dropboxusercontent.com/u/83787253/Test.RData我不知道如何解決這個問題,請。 – Duck

0

這種變化會隨着計數。不知道,如果你真的有其他可能的字母,但如果這樣做,你需要做這樣的事情:

cbind(
    Test, 
    Count=apply(
    Test[-1], 1, 
    function(x) sum(x[-1][x[[1]]:(as.numeric(x[[1]]) + 4)] == "A") 
)) 

# ID Index s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 Count 
# 1 a  1 A A A A A A A A A A  5 
# 2 b  3 <NA> <NA> A A A A A A A A  5 
# 3 c  5 <NA> <NA> <NA> <NA> A A A A A A  5 
# 4 d  1 A A A A A A A A A A  5 
# 5 e  1 A A A A A A A A A A  5 
# 6 f  6 <NA> <NA> <NA> <NA> <NA> A A A A A  5 
# 7 g  6 <NA> <NA> <NA> <NA> <NA> A A A A A  5 
# 8 h  4 <NA> <NA> <NA> A A A A A A A  5  

我覺得你的方法主要問題是你想混合正負數指數爲Test。這也不完全清楚Test$Index.Test$Indexapply裏面。

相關問題