I have a data.frame where some cells contain strings of comma separate values:
d <- data.frame(a=c(1:3),
b=c("name1, name2, name3", "name4", "name5, name6"),
c=c("name7","name8, name9", "name10" ))
I want to separate those strings where each name is split into its own cell. This is easy with
tidyr::separate_rows(d, b, sep=",")
if it is done for one column a time. But I can't do this for both columns "b" and "c" at the same time, since it requires that the number of names in each string is the same. Instead of writing
tidyr::separate_rows(d, b, sep=",")
tidyr::separate_rows(d, c, sep=",")
Is there a way to do this in a one-liner, for e.g. with apply? Something like
apply(d, 2, separate_rows(...))
Not sure how to pass the arguments to the separate_rows()
function.
You can use a pipe. Note that
sep = ", "
is automatically detected.Note: Using tidyr version 0.6.0, where the
%>%
operator is included in the package.Update: Using @doscendodiscimus comment, we could use a
for()
loop and reassignd
in each iteration. This way we can have as many columns as we like. We will use a character vector of column names, so we'll need to switch to the standard evaluation version,separate_rows_
.which gives the updated
d
Here's an alternative approach using
splitstackshape::cSplit
andzoo::na.locf
.