将具有不同长度的列表转换为R中的数据帧或数据表

时间:2018-07-19 12:23:55

标签: r

我有一个清单清单。这些列表的长度不同。

listXYZ <- list(c("x1", "x2", "x3"),
                c("y1", "y2", "y3", "y4", "y5", "y6"),
                c("z1"))

我想将列表转换为表格,以便使用knitrxtable中进行打印,但是我想避免使用plyr,因为我已经加载了dplyr并且不想两者中都可用的命令造成混乱(也不要在所有内容前面都写package::)。没有这种限制,我会使用

 plyr::ldply(listXYZ, rbind)

但是我见过的最简单的非plyr等效项是

  do.call(rbind, listXYZ)

,它通过重复较短的列表直到达到最长列表的长度来替换空格。较短列表中的空白应填充NA,

其他方法由于列表长度不同而导致错误消息,例如:

 In (function (..., deparse.level = 1)  :
 number of columns of result is not a multiple of vector length (arg 1)

是否有一种方法可以很好地进行扩展(对于较大的列表)?就我而言,列表将始终有5行,但是列表的长度差异很大。

2 个答案:

答案 0 :(得分:1)

可以通过更新length属性来解决您遇到的问题。

class A{
    public`enter code here`static void main (String args[]){
        int array[]= {-5, -4, 0, 2, 10, 3, -3};
        int min;
        int second_min;
        if(array[0]<array[1]){
            min=array[0];
            second_min=array[1];
        }else{
            min=array[1];
            second_min=array[0];
        }
        for(int i=2;i<array.length;i++){
            if(second_min > array[i] && min > array[i]){
                    second_min=min;
                    min=array[i];                              
            }else  if(second_min > array[i] && min < array[i]){
                min=min;
                second_min=array[i];
            }
        }
        System.out.println(min);
        System.out.println(second_min);
    }
}

摘自文档:当向量延长时,将使用NA填充到其新长度

答案 1 :(得分:0)

索引到向量的末尾会导致NA,因此您可以使用它来填充NA:

max_len <- max(sapply(listXYZ,length))
do.call("rbind",lapply(listXYZ,function(x) x[seq(max_len)]))
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] "x1" "x2" "x3" NA   NA   NA  
[2,] "y1" "y2" "y3" "y4" "y5" "y6"
[3,] "z1" NA   NA   NA   NA   NA