複数の列セットを収集する問題は、既にGather multiple sets of columnsで扱っていましたが、私の場合は列が一意ではありません。複数の列セットを1つの列にまとめる
Iは、次のデータを持っている:質問 ため
- 識別子:最初の列は、IDである
input <- data.frame( id = 1:2, question = c("a", "b"), points = 0, max_points = c(3, 5), question = c("c", "d"), points = c(0, 20), max_points = c(5, 20), check.names = F, stringsAsFactors = F ) input #> id question points max_points question points max_points #> 1 1 a 0 3 c 0 5 #> 2 2 b 0 5 d 20 20
、私は多くの繰り返しの列を(元のデータセットは、133個の列を有する)を有します
- ポイント付与
- 最大ポイント
:
expected <- data.frame(
id = c(1, 2, 1, 2),
question = letters[1:4],
points = c(0, 0, 0, 20),
max_points = c(3, 5, 5, 20),
stringsAsFactors = F
)
expected
#> id question points max_points
#> 1 1 a 0 3
#> 2 2 b 0 5
#> 3 1 c 0 5
#> 4 2 d 20 20
私はいくつかのことを試してみました:
tidyr::gather(input, key, val, -id)
reshape2::melt(input, id.vars = "id")
の両方が所望の出力を配信しません。さらに、重複する列が多すぎるため、ここに示した列より多くの列があると、gather
はそれ以上は機能しません。回避策として
は、私はこれを試してみました:この問題は既にここで議論されたDuplicate identifiers for rows (3, 9), (4, 10), (1, 7), (2, 8)
:Unexpected behavior with tidyrを、私は別のものを追加する必要がありますどのように、なぜ/私にはわからないエラーを与える
# add numbers to make col headers "unique"
names(input) <- c("id", paste0(1:(length(names(input)) - 1), names(input)[-1]))
# gather, remove number, spread
input %>%
gather(key, val, -id) %>%
mutate(key = stringr::str_replace_all(key, "[:digit:]", "")) %>%
spread(key, val)
識別子。おそらくこれは主要な問題ではないでしょう。なぜなら私は多分、すべてのことに異なったアプローチをするべきだからです。
問題を解決するにはどうすればよいですか?tidyr
またはベースで行うことができますか? data.table
の使い方はわかりませんが、単純な解決策がある場合は、それも解決します。
質問、max_points、およびポイントの列はすべて実際に同じ名前が付けられていますか? –
'rbind(input [、c(1,2:4)]、input [、c(1,5:7)])'? – zx8754
@MikeyMikeはい。 –