代码之家  ›  专栏  ›  技术社区  ›  Robbie McM

如何使列表中的所有数据帧具有相同的列数?

  •  0
  • Robbie McM  · 技术社区  · 2 年前

    我试图使列表中的所有数据帧具有相同的列数。

    创建一个包含3个数据帧的列表,但第二个数据帧有一个额外的列。

        my_data<- 
            list(    data.frame(
             V1= c(1,1,1,1,1),
             V2= c(2,2,2,2,2),
             V3= c(3,3,3,3,3),
             V4= c(4,4,4,4,4),
             V5= c(5,5,5,5,5)), 
           data.frame(
             V1= c(1,1,1,1,1),
             V2= c(2,2,2,2,2),
             V3= c(3,3,3,3,3),
             V4= c(4,4,4,4,4),
             V5= c(5,5,5,5,5),
             V6= c(6,6,6,6,6)),
           data.frame(
             V1= c(1,1,1,1,1),
             V2= c(2,2,2,2,2),
             V3= c(3,3,3,3,3),
             V4= c(4,4,4,4,4),
             V5= c(5,5,5,5,5))
    

    手动移除列:如果df[[2]]有>;5列,移除第6列

    if (ncol(my_data[[2]])>5) {
    my_data[[2]][,-6]
    }
    

    但是,在列表中循环时,为什么相同的逻辑不起作用呢?

    for (i in 1:length(my_data)) {
    
     if (ncol(my_data[[i]])>5) {
    my_data[[i]][,-6]
     } 
    }
    
    3 回复  |  直到 2 年前
        1
  •  0
  •   langtang    2 年前

    你的逻辑很好。在循环中迭代时,必须将更新后的帧分配回列表中的该元素。

    只需更换:

    my_data[[i]][,-6]
    

    具有

    my_data[[i]]<-my_data[[i]][,-6]
    

    if 条款

        2
  •  0
  •   akrun    2 年前

    获取 min 所有数据的最小列数。然后在 for 循环,执行分配( <- )更新数据。中的框架元素 list

    n <- min(sapply(my_data, ncol))
    for(i in seq_along(my_data)) my_data[[i]] <- my_data[[i]][seq_len(n)]
    
        3
  •  0
  •   Jonathan    2 年前

    如果要保持列的名称相同(无论顺序如何),则可以获取常用列名,然后选择这些名称:

    selected_cols <- Reduce(intersect, lapply(my_data, names))
    my_data <- lapply(my_data, function(x) x[selected_cols, ])