【问题标题】:lapply'ing a for loop returns NULL应用 for 循环返回 NULL
【发布时间】:2016-02-25 16:23:32
【问题描述】:

我有一个简单的列表

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)

我现在想用 f​​or 循环将 ; 之后的所有文本子化,就像这样

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

我在这里错过了什么?

【问题讨论】:

    标签: r list for-loop gsub lapply


    【解决方案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无论如何都会返回TRUE或FALSE(所以你不需要测试TRUE==TRUE)。

    【讨论】:

    • 谢谢。这是一个令人尴尬的错误。
    • @USER_1 不客气。顺便说一句,没有错误是令人尴尬的,即使是有经验的用户/开发人员有时也需要一些帮助(尤其是在长时间解码之后)。所以,没有必要感到尴尬:)
    猜你喜欢
    • 2021-01-06
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2016-11-30
    • 1970-01-01
    • 2016-12-30
    • 2011-11-25
    相关资源
    最近更新 更多