2013-07-02 85 views
1

我有一個列表:如何修改列表中的數值

xxx 

[[1]] 
[1] 1899 99 99 97 97 97 97 97 

[[2]] 
[1] 86 86 86 86 86 86 86 

[[3]] 
[1] 1897 97 97 97 97 97 97 97 97 97 

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

[[5]] 
[1] 1883 83 83 83 83 83 83 83 83 83 

Dput:

list(c(1899L, 99L, 99L, 97L, 97L, 97L, 97L, 97L), c(86L, 86L, 
86L, 86L, 86L, 86L, 86L), c(1897L, 97L, 97L, 97L, 97L, 97L, 97L, 
97L, 97L, 97L), c(3L, 3L, 3L, 3L), c(1883L, 83L, 83L, 83L, 83L, 
83L, 83L, 83L, 83L, 83L)) 

我則選擇在每個列表元素最頻繁的價值,並通過長度重複值列表元素:

xxxh=lapply(xxx,function(x) { 

    a=max(rle(sort(x))[[1]]) 

    b=rle(sort(x))[[2]][which(rle(sort(x))[[1]]==a)] 

    hh=rep(b,length(x)) 

    return(hh) 

}) 

我得到一個警告"In max(rle(sort(x))[[1]]) : no non-missing arguments to max; returning -Inf"

結果是

xxxh 
[[1]] 
[1] 97 97 97 97 97 97 97 97 

[[2]] 
[1] 86 86 86 86 86 86 86 

[[3]] 
[1] 97 97 97 97 97 97 97 97 97 97 

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

[[5]] 
[1] 83 83 83 83 83 83 83 83 83 83 

我然後嘗試paste列表中的元素的那些值以上具有取決於每個列表元素的第一元素的nchar18190

xxxm=lapply(xxxh,function(x) { 

    kk=x[1] 


    if(nchar(kk==0)) { kk<-0 } 

    else { 

    if (nchar(kk)==1) {as.numeric(paste(190,kk,sep=""))} else { 

    if (nchar(kk)==2) as.numeric(paste(18,kk,sep=""))}} 

} 

    ) 

但我只得到zeros ...

xxxm 
[[1]] 
[1] 0 

[[2]] 
[1] 0 

[[3]] 
[1] 0 

[[4]] 
[1] 0 

[[5]] 
[1] 0 

我想獲得:

xxxm 
[[1]] 
[1] 1897 

[[2]] 
[1] 1896 

[[3]] 
[1] 1897 

[[4]] 
[1] 1903 

[[5]] 
[1] 1883 

我在做什麼錯:(

順祝商祺!

回答

3

您的第一個if(nchar(kk==0))應該是if(nchar(kk)==0)

+0

Aaaah謝謝!我得到了codeblind ... – user1665355

4

可以簡化這一過程大大下降到兩行:

使用lapplytablewhich.max拿到模式。 (統計模式,而不是R-語言模式
然後使用ifelse相應地粘貼,使用情況,如果該值小於10

# find the most frequent value, using `table` & `which.max` 
mode.mylist <- lapply(mylist, function(x) names(which.max(table(x)))) 

# paste values as needed. No need to count characters. Instead check if the value is less than 10. (R coerces to numeric) 
ifelse(mode.mylist < 10, paste0("190", mode.mylist), paste0("18", mode.mylist)) 

[1] "1897" "1886" "1897" "1903" "1883" 


哪裏mylist是你的首發名單,例如:

mylist <- list(c(1899L, 99L, 99L, 97L, 97L, 97L, 97L, 97L), c(86L, 86L, 86L, 86L, 86L, 86L, 86L), c(1897L, 97L, 97L, 97L, 97L, 97L, 97L, 97L, 97L, 97L), c(3L, 3L, 3L, 3L), c(1883L, 83L, 83L, 83L, 83L, 83L, 83L, 83L, 83L, 83L)) 
+0

謝謝,很好的解決方案! – user1665355

2

你可以做這樣的事情太

xxxm <- lapply(xxx, 
       function(x) rep(which.max(tabulate(x)), length(x))) 

lapply(xxxm, function(x) 
     as.numeric(paste0(c(190, 18)[nchar(unique(x))], unique(x)))) 


[[1]] 
[1] 1897 

[[2]] 
[1] 1886 

[[3]] 
[1] 1897 

[[4]] 
[1] 1903 

[[5]] 
[1] 1883 
+0

不錯的解決方案,以及 – user1665355

+0

@ user1665355,一個很好的方式說「好的解決方案」是投票。 – Arun