cbind数据框列表和列表向量

时间:2018-02-14 19:20:16

标签: r dataframe cbind

假设我有一个名为list_df_A的data.frame的嵌套列表,它具有以下结构:

$ :'data.frame':      1 obs. of 3 variables:
  ..$ a             :chr a1
  ..$ b             :chr b1
  ..$ c             :chr c1

$ :'data.frame':      3 obs. of 3 variables:
  ..$ a             :chr [1:3] a21 a22 a23
  ..$ b             :chr [1:3] b21 b22 b23
  ..$ c             :chr [1:3] c21 c22 c23

$ :'data.frame':      1 obs. of 3 variables:
  ..$ a             :chr a3
  ..$ b             :chr b3
  ..$ c             :chr c3

所以,如果我将它们绑定到data.table / data.frame:

list_df_A <- rbindlist(list_df_A)

list_df_A将如下所示:

      a     b     c
1:   a1    a2    a3
2:  a21   b21   c21
3:  a22   b22   c22
4:  a23   b23   c23
5:   a3    b3    c3

现在,我有另一个清单。此列表实际上是json文件的根。 让我称这个列表list_root具有以下结构:

chr [1:3] "type1" "type2" "type3"

如果我将其设为data.table / data.frame:

list_root <- as.data.table(list_root)

我得到这张表

       V1
1:  type1
2:  type2
3:  type3

现在的问题是:我知道 list_root 中的type2在 list_df_A 中有3条记录。这是因为每个&#34;类型&#34;是指 list_df_A

中的一个数据框

如何告诉R何时将两个data.table结合起来,它会显示这样的内容?

           V1       a     b     c
     1: type1      a1    a2    a3
     2: type2     a21   a21   a21
     3: type2     b22   b22   b22
     4: type2     c23   c23   c23
     5: type3      a3    b3    c3

从某种意义上说,第2,3,4行属于type2?

3 个答案:

答案 0 :(得分:0)

在rbindlist之前,您可以使用mapply为每个数据框提供一个外部向量

my_list <- mapply(`[<-`, my_list, 'colname', value = list_root , SIMPLIFY = FALSE)

然后,只是对所有人进行调整。

答案 1 :(得分:0)

我对此的回答是:

我们使用.id作为键来合并两个数据帧/数据表。

对于list_root,我们首先将其转换为可数据格式,然后使用&#34; .id&#34;添加一列。所以我们有一把钥匙:

list_root <- as.data.table(list_root)[, .id := seq(1, nrow(list_root),1)]

接下来我可以在list_df_A上使用rbindlist:

list_df_A <- rbindlist(list_df_A, use.names=TRUE, fill=TRUE, idcol=TRUE)

现在两者都有一个共同的密钥&#34; .id&#34;然后我们可以执行合并:

new_dt <- merge(list_root, list_df_A, on=".id")

我们得到了所需的结果:

       V1       a     b     c    .id
 1: type1      a1    a2    a3      1
 2: type2     a21   a21   a21      2
 3: type2     b22   b22   b22      2
 4: type2     c23   c23   c23      2
 5: type3      a3    b3    c3      3

答案 2 :(得分:0)

您可以设置列表的名称,然后使用idcol参数,如下所示:

names(list_df_A) <- list_root
rbindlist(list_df_A,idcol = "id")