R 取消列出向量并从现有数据帧创建数据帧

R 取消列出向量并从现有数据帧创建数据帧,r,dataframe,R,Dataframe,我正在尝试从以下格式的现有数据帧创建一个新的数据帧。 数据帧(df)的形式如下 A B C london c("Kompast", "Kirklan", "Com") c("April 1989- June 1990", "July 1990-May 2000", "May 2000-July 2012") sydney c("kkj", "krr")

我正在尝试从以下格式的现有数据帧创建一个新的数据帧。 数据帧(df)的形式如下

   A           B                                    C
   london   c("Kompast", "Kirklan", "Com")    c("April 1989- June 1990", "July 1990-May 2000", "May 2000-July 2012")
   sydney   c("kkj", "krr")                   c("April 1990-May 2000", "May 2000-March 2012")
   newyork  Coml                              c("April 1990- May 2013", "2 years")
   chicago   NULL                              NULL
我需要取消列出数据框,并按如下方式获取它们:

A        B             C
london  Kompast April 1989- June 1990
london  Kirklan July 1990-May 2000
london  Com     May 2000-July 2012

有什么建议吗?

如评论中所示,您可以查看我的
flatten
flattelong
函数,这些函数目前位于(并在下面重新创建)

首先,这里是一些示例数据
df_1
在“B”和“C”列中的每个列表中有一个平衡的项目数,还有一个项目
NULL
。另一方面,
df_2
在每个列表列中的项目数量不平衡,并且
NULL
s散布在其中

df_1 <- data.frame(
  A = c("london", "sydney", "new york", "chicago"),
  B = I(list(letters[1:3], letters[4:5], letters[6], NULL)),
  C = I(list(LETTERS[1:3], LETTERS[4:5], LETTERS[6], NULL))
)
df_1
#          A       B       C
# 1   london a, b, c A, B, C
# 2   sydney    d, e    D, E
# 3 new york       f       F
# 4  chicago                

df_2 <- data.frame(
  A = c("london", "sydney", "new york", "chicago"),
  B = I(list(letters[1:3], letters[4:5], letters[6], NULL)),
  C = I(list(LETTERS[1:2], NULL, LETTERS[3:5], LETTERS[6:7]))
)
df_2
#          A       B       C
# 1   london a, b, c    A, B
# 2   sydney    d, e        
# 3 new york       f C, D, E
# 4  chicago            F, G
这里是df_2的

flattenLong(df_2, c("B", "C"))
#            A variable  B  C
#  1:  chicago        1 NA  F
#  2:  chicago        2 NA  G
#  3:  chicago        3 NA NA
#  4:   london        1  a  A
#  5:   london        2  b  B
#  6:   london        3  c NA
#  7: new york        1  f  C
#  8: new york        2 NA  D
#  9: new york        3 NA  E
# 10:   sydney        1  d NA
# 11:   sydney        2  e NA
# 12:   sydney        3 NA NA
另外,如果您更喜欢“宽”格式,可以直接使用
flatten
(如您在函数代码中所看到的,称为
flattelong


@akrun,如果我没记错的话,这个函数不是矢量化的。此处可能的重新实施:(要点注释中的工作版本)。您是如何做到这一点的?我认为最好回去找出为什么列中有未计算的调用,并加以修复。你是指
list(“kompasst”、“Kirklan”、“Com”)
而不是
c(“kompasst”、“Kirklan”、“Com”)
行?向量B、c是列表。数据框将它们列为c(“Kompasst”、“Kirklan”、“Com”)。因此,对于每个位置都会有多个B和C'sIt,最好共享几行数据的a
dput
。Hmm在splitstackshape imho中可能很有用。@lukeA,谢谢。这就是我的意图,如果我能抽出时间真正专注于集成我的一些bug修复,等等……:-)没有人能找到时间,你必须抓住它jk。很好的软件包,经常使用它,thx的努力。这看起来像一个伟大的软件包。但是我在match中得到一个错误
错误。fun(fun):未找到对象“transpose”
。有什么建议吗?@user3570187,你能检查一下你使用的是最新版本的“data.table”吗?
flattenLong(df_1, c("B", "C"))
#            A variable  B  C
#  1:  chicago        1 NA NA
#  2:  chicago        2 NA NA
#  3:  chicago        3 NA NA
#  4:   london        1  a  A
#  5:   london        2  b  B
#  6:   london        3  c  C
#  7: new york        1  f  F
#  8: new york        2 NA NA
#  9: new york        3 NA NA
# 10:   sydney        1  d  D
# 11:   sydney        2  e  E
# 12:   sydney        3 NA NA
flattenLong(df_2, c("B", "C"))
#            A variable  B  C
#  1:  chicago        1 NA  F
#  2:  chicago        2 NA  G
#  3:  chicago        3 NA NA
#  4:   london        1  a  A
#  5:   london        2  b  B
#  6:   london        3  c NA
#  7: new york        1  f  C
#  8: new york        2 NA  D
#  9: new york        3 NA  E
# 10:   sydney        1  d NA
# 11:   sydney        2  e NA
# 12:   sydney        3 NA NA
flatten(df_1, c("B", "C"))
#           A     B     C B_1 B_2 B_3 C_1 C_2 C_3
# 1:   london a,b,c A,B,C   a   b   c   A   B   C
# 2:   sydney   d,e   D,E   d   e  NA   D   E  NA
# 3: new york     f     F   f  NA  NA   F  NA  NA
# 4:  chicago  NULL  NULL  NA  NA  NA  NA  NA  NA