【问题标题】:Error when applying trimws() inside a for-loop in R在 R 的 for 循环中应用 trimws() 时出错
【发布时间】:2020-11-12 23:33:52
【问题描述】:

我正在尝试为 R 中 df 列表中包含的每个 df 的每一列的每一行应用 trimws() 函数。

这是我的代码:

for(i in 1:length(df_list)){
  for (j in i) {
    for(z in j){
      df_list[[i]][[j]][[z]] <- 
        trimws(df_list[[i]][[j]][[z]])
    }
    
  }  
  
}

控制台输出:

Error in .subset2(x, i, exact = exact) : subscript out of bounds

还有其他方法可以应用这个功能吗?

【问题讨论】:

    标签: r list for-loop encoding subscript


    【解决方案1】:

    我们可以通过使用 lapply 循环遍历 list 然后将 trimwslapply 按列应用来简化它(因为 trimws 是矢量化的)

    df_list1 <- lapply(df_list, function(dat) {
                     dat[] <- lapply(dat, trimws)
                    dat
             })
    

    通过j in iz in j,假设listlength与每个数据集的列数和行数相同,可能不是大小写,从而导致下标越界错误。

    根据以下示例数据,length 为 10,但nrowncol 小于该值,导致下标错误

    for(i in 1:length(df_list)){
       for (j in i) {
         for(z in j){
           df_list[[i]][[j]][[z]] <- 
             trimws(df_list[[i]][[j]][[z]])
         }
         
       }  
       
     }
    

    .subset2(x, i, exact = exact) 中的错误:下标超出范围

    数据

    df_list <- list(structure(list(col1 = c("a ", "b", "c "), col2 = c("b ", 
    "d", "f")), class = "data.frame", row.names = c(NA, -3L)), structure(list(
        col1 = c("a ", "b", "c ", "d"), col2 = c("b ", "d", "f", 
        "g "), col3 = c(" f", "d", "m ", "c")), class = "data.frame", row.names = c(NA, 
    -4L)), structure(list(col1 = c("a ", "b", "c "), col2 = c("b ", 
    "d", "f")), class = "data.frame", row.names = c(NA, -3L)), structure(list(
        col1 = c("a ", "b", "c ", "d"), col2 = c("b ", "d", "f", 
        "g "), col3 = c(" f", "d", "m ", "c")), class = "data.frame", row.names = c(NA, 
    -4L)), structure(list(col1 = c("a ", "b", "c "), col2 = c("b ", 
    "d", "f")), class = "data.frame", row.names = c(NA, -3L)), structure(list(
        col1 = c("a ", "b", "c ", "d"), col2 = c("b ", "d", "f", 
        "g "), col3 = c(" f", "d", "m ", "c")), class = "data.frame", row.names = c(NA, 
    -4L)), structure(list(col1 = c("a ", "b", "c "), col2 = c("b ", 
    "d", "f")), class = "data.frame", row.names = c(NA, -3L)), structure(list(
        col1 = c("a ", "b", "c ", "d"), col2 = c("b ", "d", "f", 
        "g "), col3 = c(" f", "d", "m ", "c")), class = "data.frame", row.names = c(NA, 
    -4L)), structure(list(col1 = c("a ", "b", "c "), col2 = c("b ", 
    "d", "f")), class = "data.frame", row.names = c(NA, -3L)), structure(list(
        col1 = c("a ", "b", "c ", "d"), col2 = c("b ", "d", "f", 
        "g "), col3 = c(" f", "d", "m ", "c")), class = "data.frame", row.names = c(NA, 
    -4L)))
    

    【讨论】:

    • 因为trimws 是矢量化的,那么lapply(df_list, function(dat) {dat[]&lt;-trimws(as.matrix(dat)); dat}) 应该可以解决问题。不需要第二次申请
    • @Onyambu 是的,这是可能的,但如果有阶级差异,可能会有一些问题
    猜你喜欢
    • 2016-03-27
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2015-07-30
    • 2011-06-21
    相关资源
    最近更新 更多