在列表的每个元素上应用函数

时间:2016-01-20 19:19:14

标签: r list lapply

我有以下

Authorization: Basic 
    SVpzSWk2SERiQjVlOFZLZFpBblVpX2ZaM2Y4YTpHbTBiSjZvV1Y4ZkM1T1FMTGxDNmpzbEFDVzhh

其中每个列表元素作为数据框。

正如您所看到的,这仅适用于第三个元素,但我希望它能够处理所有元素。

我怎样才能避免这样做:

T<-as.data.frame(lapply(tables[3][[1]], function(y) gsub("\\s+", " ", y)),stringsAsFactors = FALSE)

而不必诉诸于笨重的循环?

由于

供参考(其他元素类似)

as.data.frame(lapply(tables[1][[1]], function(y) gsub("\\s+", " ", y)),stringsAsFactors = FALSE)
as.data.frame(lapply(tables[2][[1]], function(y) gsub("\\s+", " ", y)),stringsAsFactors = FALSE)
as.data.frame(lapply(tables[3][[1]], function(y) gsub("\\s+", " ", y)),stringsAsFactors = FALSE)

2 个答案:

答案 0 :(得分:2)

尝试使用以下内容重现您的数据。

tables <- list()

tables[[1]] <- data.frame(V1=c("01D", "01Z", "02A"), V2=c("Soft tissue \r\n      inflammation ",
                                                      "Wound, other or \r\n      unspecified ", 
                                                      " Head \r\n      Injury                       "))

tables[[2]] <- data.frame(V1=c("01D", "01Z", "02A"), V2=c("Soft tissue \r\n      inflammation ",
                                                          "Wound, other or \r\n      unspecified ", 
                                                          " Head \r\n      Injury                       "))

我可以管理以下

lapply(tables,function(x) as.data.frame(apply(x,2,function(y) gsub("\\s+", " ", y))))

内部应用函数将数据框强制转换为矩阵,因此您需要将其强制转换回外部lapply函数。

输出

[[1]]
   V1                           V2
1 01D    Soft tissue inflammation 
2 01Z Wound, other or unspecified 
3 02A                 Head Injury 

[[2]]
   V1                           V2
1 01D    Soft tissue inflammation 
2 01Z Wound, other or unspecified 
3 02A                 Head Injury 

答案 1 :(得分:1)

您可以嵌套lapply以获取嵌套列表。但实际上你也可以在评论中使用HubertL提到的for循环,这可能更清楚地阅读。 嵌套的lapply看起来像这样,其中1:length(tables)只给出表的索引。

T<-lapply(1:length(tables), function(x){
                 as.data.frame(lapply(tables[x][[1]], function(y){
                   gsub("\\s+", " ", y)),stringsAsFactors = FALSE})
                 }
   )

这不是一种非常复杂的方法,但它应该可以正常工作。