R 取消列出向量并从现有数据帧创建数据帧
我正在尝试从以下格式的现有数据帧创建一个新的数据帧。 数据帧(df)的形式如下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")
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,最好共享几行数据的adput
。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