2015-11-23 162 views
1

我有一個簡單的列表lapply'ing for循環返回NULL

list1<-data.frame(col1=c("text;aaa","text", "text;aaa","text"), col2=1:4) 
list2<- data.frame(col1=c("text;aaa","text", "text;aaa","text", "text", "text"), col2=1:6) 
mylist<-list(list1,list2) 

我現在想子後的所有文本;用一個for循環,這樣

list.2 <- lapply(mylist, function(x){ 
    for(i in 1:nrow(x)){ 
    if(grepl(";",x[i,1]) == T){ 
     x[i,1] <- gsub(";.*", "", x[i,1]) 
    } else x[i,1] <- x[i,1] 
    } 
} ) 

但輸出NULL

list.2 
[[1]] 
NULL 

[[2]] 
NULL 

缺少什麼我在這裏?

回答

1

您需要在函數中lapply否則沒有返回x將得到恢復:

lapply(mylist, function(x){ 
    for(i in 1:nrow(x)){ 
    if(grepl(";",x[i,1])){ 
     x[i,1] <- gsub(";.*", "", x[i,1]) 
    } else x[i,1] <- x[i,1] 
    } 
    #return the x you modified previously 
    x 
}) 

輸出:

[[1]] 
    col1 col2 
1 text 1 
2 text 2 
3 text 3 
4 text 4 

[[2]] 
    col1 col2 
1 text 1 
2 text 2 
3 text 3 
4 text 4 
5 text 5 
6 text 6 

此外,作爲一個側面說明,你不需要grepl(";",x[i,1]) == T但只grepl(";",x[i,1])因爲grepl無論如何返回TRUEFALSE(所以你不需要測試TRUE==TRUE)。

+0

謝謝。那是一個令人尷尬的錯誤。 –

+0

@ USER_1非常歡迎。沒有錯誤是令人尷尬的,甚至有經驗的用戶/開發者有時需要一些幫助(特別是在長時間解碼之後)。所以,不需要感到尷尬:) – LyzandeR