r - tidyr 在多列上使用separate_rows

标签 r apply tidyr

我有一个 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(d, 2, separate_rows(...)) 

不确定如何将参数传递给 separate_rows()功能。

最佳答案

您可以使用管道。请注意 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,其中 %>%运算符包含在包中。

更新:使用@doscendodiscimus 评论,我们可以使用 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

关于r - tidyr 在多列上使用separate_rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39922857/

相关文章:

r - 创建新变量的字符位置标识

r - 如何将单个列扩展为宽格式,其中 0 和 1 作为有条件定义的值?

r - 在 ggplot2 中,如何更改图例标签但保持颜色不变?

r - 使用 R 裁剪空白 pdf(有独立的跨平台解决方案吗?)

r - 将 lapply 转换为 foreach?

python - 按元素对 Pandas 数据框应用条件

scheme - 为什么 Scheme 需要在 Y-combinator 实现中应用,而 Racket 不需要?

R 枢轴示例

r - 计算滚动窗口协方差矩阵

r - 通过数百万个坐标按组计算最大距离