我有一个data.frame,其中一些单元格包含逗号分隔值的字符串:
d <- data.frame(a=c(1:3),
b=c("name1, name2, name3", "name4", "name5, name6"),
c=c("name7","name8, name9", "name10" ))
我想把那些字符串分开,每个名字都被分到它自己的单元格中。
tidyr::separate_rows(d, b, sep=",")
但我不能同时对列“b”和“c”这样做,因为它要求每个字符串中的名称数相同。
tidyr::separate_rows(d, b, sep=",")
tidyr::separate_rows(d, c, sep=",")
有没有一种方法可以在一行程序中实现这一点,例如使用apply?
apply(d, 2, separate_rows(...))
不确定如何将参数传递给separate_rows()
函数。
3条答案
按热度按时间goucqfw61#
您可以使用管道。请注意,
sep = ", "
是自动检测的。**注意:**使用tidyr版本0.6.0,其中
%>%
操作符包含在包中。**更新:**使用@ docendodiscimus注解,我们可以使用
for()
循环,并在每次迭代中重新分配d
。这样我们就可以拥有任意多的列。我们将使用列名的字符向量,所以我们需要切换到标准评估版本separate_rows_
。这给出了更新后的
d
作为更新:在tidyr1.2.0中,separate_rows_被弃用,我们可以使用以下代码:
mefy6pfw2#
下面是使用
splitstackshape::cSplit
和zoo::na.locf
的替代方法。nfg76nw03#
在
tidyr
版本1.2.0中,我们可以使用everything
选择所有列来分隔,
上的行,正如@RichScriven提到的,默认分隔符是sep = ", "
。或者,我们可以指定要分隔行的列,或者我们可以简单地排除不需要的列。