我有一个 Dataframe ,像这样:
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'。
6条答案
按热度按时间ccrfmcuu1#
若干备选方案:
1)data.table的两种方式:
2)dplyr/tidyr组合:
**3)仅限tidyr:**对于
tidyr 0.5.0
(及更高版本),您也可以仅使用separate_rows
:可以使用
convert = TRUE
参数将数字自动转换为数值列。使用
tidyr_1.3.0
(及更高版本),您可以使用separate_longer_delim
(现在已取代separate_rows
):4)具有碱R:
gv8xihay2#
这个老问题经常被用作欺骗目标(标记为
r-faq
)。到今天为止,已经回答了三次,提供了6种不同的方法,但是缺乏一个基准作为指导,哪种方法是最快的1。基准解决方案包括
data.table
方法和两种dplyr
/tidyr
方法,splitstackshape
solution,data.table
方法的两个附加变体。使用
microbenchmark
包,在6种不同大小的 Dataframe 上对8种不同的方法进行了基准测试(参见下面的代码)。OP给出的样本数据仅由20行组成。为了创建更大的 Dataframe ,这20行简单地重复1、10、100、1000、10000和100000次,这给予了高达200万行的问题大小。
基准测试结果
基准测试结果表明,对于足够大的 Dataframe ,所有
data.table
方法都比任何其他方法更快。对于超过5000行的 Dataframe ,Jaap的data.table
方法2和变体DT3
是最快的,比最慢的方法快了很多。值得注意的是,两种
tidyverse
方法和splistackshape
解决方案的时间非常相似,以至于很难区分图表中的曲线。它们是所有 Dataframe 大小的基准方法中最慢的。对于较小的 Dataframe ,Matt的基本R解决方案和
data.table
方法4似乎比其他方法具有更少的开销。代码
为问题大小为
n
的benchmark运行定义函数针对不同问题大小运行基准测试
准备出图数据
创建图表
Session信息和包版本(节选)
1我的好奇心被这番热情洋溢的评论激起了 * 太棒了!数量级更快!* 到a question的
tidyverse
答案,该答案作为此问题的重复而关闭。h7appiyu3#
命名你的原始数据.frame
v
,我们有:注意使用
rep
构建新的AB列。在这里,sapply
返回每个原始行中的名称数。2skhul334#
虽然有些晚了,但另一个通用的替代方案是使用我的“splitstackshape”包中的
cSplit
,它有一个direction
参数。将其设置为"long"
以获得指定的结果:wko9yo5t5#
hkmswyz66#
另一个使用
strsplit
从 base 得到的基准测试目前可以推荐 * 将一列中的逗号分隔字符串拆分为单独的行 *,因为它在各种大小范围内都是最快的:请注意,使用
fixed=TRUE
对计时有很大影响。比较方法:
图书馆:
数据:
计算和计时结果:
注意,方法如
为
unique
director 返回strsplit
,可能与但据我所知,当局并没有提出这项要求。