非常に単純明快です;
。区切り文字としてのsに基づいて、多くの列の値を独自の行に分割する必要があるデータフレームがあります。
少し読んだ後、
df %>%
Reduce(separate_rows_, x = colnames)
sep
パラメータを渡すことができないことを除いて、機能します(したがって、空白、コンマ、およびその他の英数字以外の文字で区切ります)。
ある回答では、パラメーターを含む関数の修正バージョンを作成することを提案しましたが、それを機能させることができませんでした。
Reduce(f = function(y) separate_rows_(sep = ";"), x = colnames)
私は何が間違っているのですか?
そうは言っても、私の理想的な解決策は、それがよりクリーンであれば(多分map_dfr
?)、きちんとした解決策になるでしょう。しかし、明らかにどの解決策もなしよりも優れています:)。
サンプルデータは次のとおりです。
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 = ",")
を使用するpurrr::reduce
と、指定された関数.f
を.init
の最初の要素に.x
適用し、次に.x
、のすべての要素.x
が使用されるまで、その関数をその出力との2番目の要素などに適用できます。
.f
引数式内で、.x
は前の出力(または.init
最初の実行)で.y
あり、.x
への引数の指定された要素ですreduce
。
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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加