tidyr在多列上使用separate_rows

x759pob2  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(213)

我有一个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()函数。

goucqfw6

goucqfw61#

您可以使用管道。请注意,sep = ", "是自动检测的。

d %>% separate_rows(b) %>% separate_rows(c)
#   a     b      c
# 1 1 name1  name7
# 2 1 name2  name7
# 3 1 name3  name7
# 4 2 name4  name8
# 5 2 name4  name9
# 6 3 name5 name10
# 7 3 name6 name10

**注意:**使用tidyr版本0.6.0,其中%>%操作符包含在包中。
**更新:**使用@ docendodiscimus注解,我们可以使用for()循环,并在每次迭代中重新分配d。这样我们就可以拥有任意多的列。我们将使用列名的字符向量,所以我们需要切换到标准评估版本separate_rows_

cols <- c("b", "c")
for(col in cols) {
    d <- separate_rows_(d, col)
}

这给出了更新后的d

a     b      c
1 1 name1  name7
2 1 name2  name7
3 1 name3  name7
4 2 name4  name8
5 2 name4  name9
6 3 name5 name10
7 3 name6 name10

作为更新:在tidyr1.2.0中,separate_rows_被弃用,我们可以使用以下代码:

cols <- c("b", "c")
for (col in cols) {
  d <- separate_rows(d, all_of(col))
}
mefy6pfw

mefy6pfw2#

下面是使用splitstackshape::cSplitzoo::na.locf的替代方法。

library(splitstackshape)
library(zoo)

df <- cSplit(d, 1:ncol(d), "long", sep = ",")
na.locf(df[rowSums(is.na(df)) != ncol(df),])
#    a     b      c
#1:  1 name1  name7
#2:  1 name2  name7
#3:  1 name3  name7
#4:  2 name4  name8
#5:  2 name4  name9
#6:  3 name5 name10
#7:  3 name6 name10
nfg76nw0

nfg76nw03#

tidyr版本1.2.0中,我们可以使用everything选择所有列来分隔,上的行,正如@RichScriven提到的,默认分隔符是sep = ", "

library(tidyr)

d %>% 
  separate_rows(everything())
    • 产出**
a b     c     
  <int> <chr> <chr> 
1     1 name1 name7 
2     1 name2 name7 
3     1 name3 name7 
4     2 name4 name8 
5     2 name4 name9 
6     3 name5 name10
7     3 name6 name10

或者,我们可以指定要分隔行的列,或者我们可以简单地排除不需要的列。

d %>% 
  separate_rows(b, c)

d %>% 
  separate_rows(-a)

相关问题