如何将长度不等的向量列表转换为数据帧

时间:2019-10-22 15:37:59

标签: r list dataframe vector

我需要将以下列表转换为数据框:

list(c(13, 5, 9, 16, 1, 7, 3, 20), c(0, 1, 2, 7, 8, 14, 20), c(2, 4, 7, 9, 12, 14, 16), 0:9, c(18, 19, 20, 21, 22, 23, 6, 7, 8, 9), c(0, 1, 7, 13, 19, 6, 12, 18, 2, 8), 23:22, c(18, 13, 8), c(18, 13, 8, 3, 10, 17, 12, 6, 0, 1), c(18, 14), c(18, 19, 20, 21, 13, 7, 8, 14, 2, 1), c(13, 15, 16, 9, 8, 7, 14, 20, 19, 18))

列表具有以下结构:

List of 1
 $ :List of 12
  ..$ : int [1:8] 13 5 9 16 1 7 3 20
  ..$ : int [1:7] 0 1 2 7 8 14 20
  ..$ : int [1:7] 2 4 7 9 12 14 16
  ..$ : int [1:10] 0 1 2 3 4 5 6 7 8 9
  ..$ : int [1:10] 18 19 20 21 22 23 6 7 8 9
  ..$ : int [1:10] 0 1 7 13 19 6 12 18 2 8
  ..$ : int [1:2] 23 22
  ..$ : int [1:3] 18 13 8
  ..$ : int [1:10] 18 13 8 3 10 17 12 6 0 1
  ..$ : int [1:2] 18 14
  ..$ : int [1:10] 18 19 20 21 13 7 8 14 2 1
  ..$ : int [1:10] 13 15 16 9 8 7 14 20 19 18

因为每个向量都可以由12个整数组成,所以我想将此列表转换为如下所示的数据帧:

    P01 P02 P03 P04 P05 P06 P07 P08 P09 P10 P11 P12
D01 13  5   9   16  1   7   3   20  NA  NA  NA  NA
D02 0   1   2   7   8   14  20  NA  NA  NA  NA  NA
D03 2   4   7   9   12  14  16  NA  NA  NA  NA  NA

... and so on

任何修复技巧都将受到赞赏。

3 个答案:

答案 0 :(得分:5)

假设列表列表名为x,则可以使用

sapply(1:12, function(i) sapply(x, `[`, i))

获取所需的数据。在这里,我们迭代要从每个向量中提取的不同索引。当您要求一个不存在的职位时,R就会发生这种情况,您得到NA。您只需要添加具有所需值的行/列名称即可。

答案 1 :(得分:2)

您可以通过修改列表中原始矢量的长度来实现。 勒给清单 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:tools="http://schemas.android.com/tools" android:paddingTop="16dp" android:gravity="bottom" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" xmlns:app="http://schemas.android.com/apk/res-auto" android:background="@color/md_white_1000"> <ImageView android:id="@+id/iconIv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="50dp" android:src="@drawable/ic_success" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toTopOf="@id/titleTv" /> <TextView android:id="@+id/titleTv" style="@style/FontLocalizedBold" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:text="@string/payment_success" android:textColor="@color/colorTextPrimary" android:textSize="24sp" android:layout_marginStart="24dp" android:gravity="center" android:layout_marginEnd="24dp" android:maxLines="2" android:layout_marginTop="16dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> <TextView android:id="@+id/descriptionTv" style="@style/FontLocalizedMedium" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="24dp" android:layout_marginTop="48dp" android:layout_marginEnd="24dp" android:gravity="center" tools:text="@string/payment_success_description" android:textSize="17sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/titleTv" /> <TextView android:id="@+id/okTv" style="@style/ButtonTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" android:paddingBottom="16dp" android:background="@drawable/save_button_active" android:text="@string/done" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>

打电话
a

然后计算最大长度

a <- list(
    c(13, 5, 9, 16, 1, 7, 3, 20),
    c(0, 1, 2, 7, 8, 14, 20),
    c(2, 4, 7, 9, 12, 14, 16),
    0:9,
    c(18, 19, 20, 21, 22, 23, 6, 7, 8, 9),
    c(0, 1, 7, 13, 19, 6, 12, 18, 2, 8),
    23:22,
    c(18, 13, 8),
    c(18, 13, 8, 3, 10, 17, 12, 6, 0, 1),
    c(18, 14),
    c(18, 19, 20, 21, 13, 7, 8, 14, 2, 1),
    c(13, 15, 16, 9, 8, 7, 14, 20, 19, 18)
  )

并修改列表中每个元素的长度

n <- max(sapply(a, length))

最后,更改名称

b <- lapply(a, function(el) {length(el) <- n ; el})
res <- do.call("rbind", b)

答案 2 :(得分:2)

将列表L的每个组成部分转换为ts系列,将它们绑定在一起,删除其分配和转置的混乱名称。这样将得到一个矩阵,其中每个分量只有一行,而列的长度与最长分量一样多。

t(unname(do.call("cbind", lapply(L, ts))))