我需要将以下列表转换为数据框:
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
任何修复技巧都将受到赞赏。
答案 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))))