我有一个数据框,如下所示:
data.frame(director = c("Aaron Blaise,Bob Walker", "Akira Kurosawa",
"Alan J. Pakula", "Alan Parker", "Alejandro Amenabar", "Alejandro Gonzalez Inarritu",
"Alejandro Gonzalez Inarritu,Benicio Del Toro", "Alejandro González Iñárritu",
"Alex Proyas", "Alexander Hall", "Alfonso Cuaron", "Alfred Hitchcock",
"Anatole Litvak", "Andrew Adamson,Marilyn Fox", "Andrew Dominik",
"Andrew Stanton", "Andrew Stanton,Lee Unkrich", "Angelina Jolie,John Stevenson",
"Anne Fontaine", "Anthony Harvey"), AB = c('A', 'B', 'A', 'A', 'B', 'B', 'B', 'A', 'B', 'A', 'B', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'A'))
如您所见, director
列中的一些条目是由逗号分隔的多个名称 . 我想将这些条目拆分为单独的行,同时保持另一列的值 . 例如,上面数据框中的第一行应该分成两行, director
列中的每一行都有一个, AB
列中的'A' .
4 回答
这个老问题经常被用作欺骗目标(用
r-faq
标记) . 截至今天,已经回答了三次,提供了6种不同的方法,但是 is lacking a benchmark 作为指导哪种方法最快1 .基准测试解决方案包括
Matthew Lundberg's base R approach但根据Rich Scriven's comment进行了修改,
Jaap's两个
data.table
方法和两个dplyr
/tidyr
方法,Ananda's splitstackshapesolution,
和Jaap的
data.table
方法的另外两个变种 .总共8种不同的方法使用
microbenchmark
包对6种不同大小的数据帧进行了基准测试(参见下面的代码) .OP给出的样本数据仅包含20行 . 为了创建更大的数据帧,这20行简单地重复1次,10次,100次,1000次,10000次和100000次,这给出了最多200万行的问题大小 .
基准测试结果
基准测试结果表明,对于足够大的数据帧,所有
data.table
方法都比任何其他方法更快 . 对于具有超过约5000行的数据帧,Jaap的data.table
方法2和变体DT3
是最快的,比最慢的方法更快 .值得注意的是,两个
tidyverse
方法和splistackshape
解决方案的时间非常相似,因此难以对图表中的曲线进行分类 . 它们是所有数据帧大小中最慢的基准测试方法 .对于较小的数据帧,Matt的基本R解决方案和
data.table
方法4似乎比其他方法具有更少的开销 .代码
为问题大小n的基准运行定义函数
针对不同的问题规模运行基准
准备绘图数据
创建图表
会话信息和包版本(摘录)
这个充满激情的评论Brilliant激起了一股好奇心!秩序更快!对作为这个问题的副本而被关闭的问题的一个整体回答 .
命名原始data.frame
v
,我们有:注意使用
rep
来构建新的AB列 . 这里,sapply
返回每个原始行中的名称数 .几种选择:
1) two ways with data.table:
2) a dplyr/tidyr combination: 或者,您也可以使用
dplyr
/tidyr
组合:3) with tidyr only: 使用tidyr 0.5.0(及更高版本),您也可以使用
separate_rows
:您可以使用
convert = TRUE
参数自动将数字转换为数字列 .4) with base R:
晚到派对,但另一个通用的替代方法是使用"splitstackshape"包来自"splitstackshape"包含
direction
参数 . 将其设置为"long"
以获取您指定的结果: