2012-10-19 59 views
1

我認爲這將是微不足道的......如何通過列表的組件應用功能中的R

這裏是我的名單的前兩個組成部分:

foo <- structure(list(vv = structure(list(`0` = c("C RR", "G RR", "nil", 
"C AA", "G AA", "nil", "C RV", "G RV", "nil", "C VB", "G VB", 
"nil", "C RV", "C AA", "G AA", "nil", "G AA", "nil", "C VB", 
"G VB", "nil", "C RJ"), `1` = c("G RJ", "nil", "G RJ", "nil", 
"G RJ", "C RV", "G RV", "nil", "C AJ", "G AJ", "nil", "C BB", 
"G BB", "C BB", "G BB", "nil", "C BV", "G BV", "nil", "C JA", 
"G JA", "nil", "C AJ", "G AJ", "C AJ", "G AJ", "nil", "C RJ", 
"G RJ", "nil", "C RJ", "G RJ", "nil"), `2` = c("nil", "C JA", 
"G JA", "C JR", "G JR", "nil", "C JR", "G JR", "nil", "C BB", 
"G BB", "nil", "C VV", "nil", "C AJ", "G AJ", "nil", "C AJ", 
"G AJ", "nil", "C AJ", "nil", "C BV", "G BV", "nil", "C BV", 
"nil", "C BV", "G BV", "nil"), `3` = c("nil", "C RJ", "G RJ", 
"C RJ", "G RJ", "nil", "C JA", "G JA", "nil", "C VR", "G VR", 
"nil", "C BV", "G BV", "nil", "C BV", "G BV", "nil", "C AA", 
"G AA", "C AA", "G AA", "nil", "C AA", "G AA", "nil", "C AJ", 
"G AJ", "nil", "C AJ", "G AJ", "nil", "C JA", "G JA", "nil", 
"C JA", "G JA", "nil", "C BV", "nil"), `4` = c("nil", "C VB", 
"G VB", "nil", "C VB", "G VB", "nil", "C BV", "G BV", "nil", 
"C RJ", "G RJ", "nil", "C RJ", "G RJ", "nil", "C RR", "G RR", 
"nil", "C RV", "nil", "C JA", "G JA", "nil", "C AA", "C JA", 
"nil", "C RV", "G RV", "nil", "C RV", "nil", "C VV", "C BB", 
"G BB", "nil", "C RV", "G RV", "nil", "C VB", "nil", "C JA", 
"G JA", "nil", "C BB", "nil", "C RR", "nil", "C RR", "nil", "C JA", 
"nil", "C RR", "nil", "C RR", "nil", "C JA", "nil"), `5` = c("nil", 
"C BB", "G BB", "nil", "C RR", "nil", "C VB", "nil", "C AA", 
"nil", "C VB", "nil", "C VB", "nil", "C VB", "nil", "C VB", "nil", 
"C VB", "nil", "C JA", "nil", "C VB", "G VB", "nil", "C AJ", 
"nil", "C VB", "C BB", "nil", "C AJ", "G AJ", "nil", "C RR", 
"nil", "C AJ", "nil", "C AJ", "nil", "C JA", "G JA", "nil"), 
    `6` = c("nil", "C BB", "nil", "C AA", "nil", "C AA", "nil", 
    "C AA", "nil", "C RR", "nil", "C VB", "G VB", "C RV", "G RV", 
    "nil", "C VB", "G VB", "nil", "C BB", "nil", "C BB", "nil", 
    "C BV", "nil", "C RV", "nil", "C BV", "nil", "C BV", "nil", 
    "C JA", "nil")), .Names = c("0", "1", "2", "3", "4", "5", 
"6")), rv = structure(list(`0` = c("nil", "C VB", "G VB", "nil", 
"G VB", "nil", "C RR", "G RR", "nil", "C RV", "C AA", "G AA", 
"nil", "G RR", "C RR", "G RR", "C RR", "G RR"), `1` = c("nil", 
"C RV", "G RV", "C RV", "G RV", "nil", "G JR", "nil", "C AJ", 
"G AJ", "C AJ", "G AJ", "C AJ", "G AJ", "nil", "C AJ", "nil", 
"C JA", "G JA", "C RV", "G RV", "C RV", "G RV", "C RV", "G RV", 
"nil"), `2` = c("nil", "C JR", "G JR", "nil", "C BB", "G BB", 
"nil", "C BV", "G BV", "nil", "C VV", "G VV", "C VV", "G VV", 
"nil"), `3` = c("nil", "C AA", "G AA", "C AA", "G AA", "nil", 
"C JA", "nil", "C BV", "G BV", "C BV", "G BV", "nil", "C BV", 
"G BV", "nil", "C RJ", "G RJ"), `4` = c("nil", "C VV", "G VV", 
"nil", "C VR", "G VR", "nil", "C RJ", "G RJ", "C RJ", "G RJ", 
"nil", "C VB", "G VB", "nil", "C JA", "G JA", "C JA", "G JA", 
"nil", "C VB", "G VB", "C VB", "G VB"), `5` = c("nil", "C RR", 
"G RR", "nil", "C BB", "G BB", "nil", "G BB", "nil", "C JA", 
"G JA", "nil"), `6` = c("nil", "C BV", "G BV", "nil", "G BV", 
"nil", "C RJ", "nil", "C BB", "nil", "C BB", "nil", "C AJ", "nil", 
"C BB", "G BB", "nil", "C RV", "nil")), .Names = c("0", "1", 
"2", "3", "4", "5", "6"))), .Names = c("vv", "rv"), class = "data.frame", row.names = c(NA, 
-7L)) 

我可以mapply到一個特定的組件:

> mapply(function(x) sum(substr(x,1,1)=="C"),foo[[1]]) 
0 1 2 3 4 5 6 
8 10 11 14 24 19 15 

> mapply(function(x) sum(substr(x,1,1)=="C"),foo[[2]]) 
0 1 2 3 4 5 6 
6 10 5 7 9 3 7 

這是預期的輸出。但是如何將這個函數應用到列表的每個組件?我似乎無法找到解決方案。我不明白爲什麼似乎沒有辦法一次性對每個組件進行篡改。也許我的列表可能有不同的結構?這份清單似乎很奇怪,但其中的信息是正確的。

理想的情況下,預期產量將是一個矩陣,與組件的NE的名字,像:

structure(c(8L, 10L, 11L, 14L, 24L, 19L, 15L, 6L, 10L, 5L, 7L, 
9L, 3L, 7L), .Dim = c(7L, 2L), .Dimnames = list(c("0", "1", "2", 
"3", "4", "5", "6"), c("vv", "rv"))) 

回答

2

你就要成功了。

FUN <- function(x) sum(substr(x,1,1)=="C") 
sapply(foo,function(x) mapply(FUN,x)) 

    vv rv 
0 8 6 
1 10 10 
2 11 5 
3 14 7 
4 24 9 
5 19 3 
6 15 7 

原則上我認爲應該sapply(foo,mapply,FUN=FUN)工作,但它沒有(參與評估論證只是有點太聰明)。

+0

謝謝本,對我的實際數據集很好。如果我可能會問的話,在這種情況下,如何使用脈衝星與脈衝星有什麼邏輯關係。再次感謝 ! – Chargaff

+0

好吧,邏輯是你說你想「將這個函數應用到列表的每個組件上」 - 這正是「sapply」所做的事情......我只是將已經寫入的單組件函數封裝在'sapply'電話...... –