首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将separate_rows()应用于所有列,并传递一个“隔”参数?

如何将separate_rows()应用于所有列,并传递一个“隔”参数?
EN

Stack Overflow用户
提问于 2019-11-06 20:22:28
回答 1查看 166关注 0票数 0

非常直截了当:我有一个数据框架,其中许多列中的值需要分割成它们自己的行,基于;作为分隔符。

看了一会儿之后,

代码语言:javascript
运行
复制
df %>%
   Reduce(separate_rows_, x = colnames)

工作,但我不能传递sep参数(因此它也用空格、逗号和其他非字母数字字符分隔)。

有一个答案建议编写包含参数的函数的修改版本,但我无法做到这一点:

Reduce(f = function(y) separate_rows_(sep = ";"), x = colnames)

我做错了什么?

话虽如此,如果我的解决方案更干净(也许是map_dfr?),我的理想解决方案将是一个tidyverse解决方案;但显然,任何解决方案都比没有更好:)。

以下是样本数据:

代码语言:javascript
运行
复制
structure(list(q1 = c("1,2,3,4", "2,4"), q2 = c("a,b", "e,f"), 
q3 = c("c,d", "g,h,z")), row.names = 1:2, class = "data.frame")

预期产出:

代码语言:javascript
运行
复制
structure(list(q1 = c("1", "1", "1", "1", "2", "2", "2", "2", 
"3", "3", "3", "3", "4", "4", "4", "4", "2", "2", "2", "2", "2", 
"2", "4", "4", "4", "4", "4", "4"), q2 = c("a", "a", "b", "b", 
"a", "a", "b", "b", "a", "a", "b", "b", "a", "a", "b", "b", "e", 
"e", "e", "f", "f", "f", "e", "e", "e", "f", "f", "f"), q3 = c("c", 
"d", "c", "d", "c", "d", "c", "d", "c", "d", "c", "d", "c", "d", 
"c", "d", "g", "h", "z", "g", "h", "z", "g", "h", "z", "g", "h", 
"z")), row.names = c(NA, -28L), class = "data.frame")

我想要简化的过程不需要像这样传递每个列名:

代码语言:javascript
运行
复制
output <- test %>% 
  separate_rows(q1, sep = ",") %>% 
  separate_rows(q2, sep = ",") %>% 
  separate_rows(q3, sep = ",")  
EN

Stack Overflow用户

回答已采纳

发布于 2019-11-06 21:11:13

您可以使用purrr::reduce,它将给定的函数.f应用于.init.x的第一个元素,然后将函数应用于该函数和.x的第二个元素的输出,等等,直到使用了.x的所有元素。

.f参数公式中,.x是前面的输出(或第一次运行的.init ),.yreduce.x参数的给定元素。

代码语言:javascript
运行
复制
library(tidyverse)

reduce(.init = df, .x = names(df), .f = ~separate_rows(.x, .y, sep = ','))
# equiv to: reduce(.init = df, .x = names(df), .f = separate_rows, sep = ',')

正如注释中的akrun注释所指出的,这也可以用下面的代码在基R中完成(相同的输出)

代码语言:javascript
运行
复制
Reduce(function(x, y) separate_rows(x, y, sep=","), names(df), init = df)

#    q1 q2 q3
# 1   1  a  c
# 2   1  a  d
# 3   1  b  c
# 4   1  b  d
# 5   2  a  c
# 6   2  a  d
# 7   2  b  c
# 8   2  b  d
# 9   3  a  c
# 10  3  a  d
# 11  3  b  c
# 12  3  b  d
# 13  4  a  c
# 14  4  a  d
# 15  4  b  c
# 16  4  b  d
# 17  2  e  g
# 18  2  e  h
# 19  2  e  z
# 20  2  f  g
# 21  2  f  h
# 22  2  f  z
# 23  4  e  g
# 24  4  e  h
# 25  4  e  z
# 26  4  f  g
# 27  4  f  h
# 28  4  f  z
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58737937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档