非常直截了当:我有一个数据框架,其中许多列中的值需要分割成它们自己的行,基于;
作为分隔符。
看了一会儿之后,
df %>%
Reduce(separate_rows_, x = colnames)
工作,但我不能传递sep
参数(因此它也用空格、逗号和其他非字母数字字符分隔)。
有一个答案建议编写包含参数的函数的修改版本,但我无法做到这一点:
Reduce(f = function(y) separate_rows_(sep = ";"), x = colnames)
我做错了什么?
话虽如此,如果我的解决方案更干净(也许是map_dfr
?),我的理想解决方案将是一个tidyverse解决方案;但显然,任何解决方案都比没有更好:)。
以下是样本数据:
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")
预期产出:
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")
我想要简化的过程不需要像这样传递每个列名:
output <- test %>%
separate_rows(q1, sep = ",") %>%
separate_rows(q2, sep = ",") %>%
separate_rows(q3, sep = ",")
发布于 2019-11-06 21:11:13
您可以使用purrr::reduce
,它将给定的函数.f
应用于.init
和.x
的第一个元素,然后将函数应用于该函数和.x
的第二个元素的输出,等等,直到使用了.x
的所有元素。
在.f
参数公式中,.x
是前面的输出(或第一次运行的.init
),.y
是reduce
的.x
参数的给定元素。
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中完成(相同的输出)
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
https://stackoverflow.com/questions/58737937
复制相似问题