いくつかの行と列を共有する3つのデータフレームのリストがあります
データ
all_data <- list(questionnaireA = structure(list(name = structure(2:1, .Label = c("James",
"Shawn"), class = "factor"), banana = c(1, 0), grapes = c(1,
1), orange = c("AB", 1)), class = "data.frame", row.names = c(NA,
-2L)), questionnaireB = structure(list(name = structure(2:1, .Label = c("Chris",
"James"), class = "factor"), orange = c(1, 0), banana = c(1,
0)), class = "data.frame", row.names = c(NA, -2L)), questionnaireC = structure(list(
name = structure(3:1, .Label = c("Donald", "James", "Shawn"
), class = "factor"), banana = c(1, 0, 0), raisins = c(1,
1, 1), grapes = c(1, 1, 0), cake = c(0, 1, 0)), class = "data.frame", row.names = c(NA, -3L)))
$questionnaireA name banana grapes orange 1 Shawn 1 1 AB 2 James 0 1 1 $questionnaireB name orange banana 1 James 1 1 2 Chris 0 0 $questionnaireC name banana raisins grapes cake 1 Shawn 1 1 1 0 2 James 0 1 1 1 3 Donald 0 1 0 0
library(tidyverse)
map(all_data, ~ .x %>%
pivot_longer(cols=-name, names_to="fruit"))
どんな助けでもいただければ幸いです!
OPが試みた方法と同様のオプションに従う場合、つまり、内の各データセットを「long」形式に再形成しlist
、ループしてimap
、list1
要素の名前を新しい列として作成し、を使用pivot_longer
して「long」形式に再形成します。グループごとにシーケンス列を作成し、「ワイド」形式に再形成します。pivot_wider
library(dplyr)
library(tidyr)
library(purrr)
imap_dfr(all_data, ~
.x %>%
mutate(grp = .y) %>%
pivot_longer(cols = -c(name, grp),
names_to = "fruit", values_to = "Value")) %>%
#group_by(name, grp, fruit) %>%
#mutate(rn = row_number()) %>%
pivot_wider(names_from = grp, values_from = Value)
または、を使用してすべてのデータセットを単一のデータにバインドすることにより、これをより効率的にbind_cols
実行しpivot_longer
、不足している値を削除しながらvalue_drop_na = TRUE
実行してから、上記のソリューションと同じように実行します。
bind_rows(all_data, .id = 'grp') %>%
pivot_longer(cols = c(-name, -grp), names_to = "fruit",
values_to = "Value", values_drop_na = TRUE) %>%
# sequence column creation is not really required for the example
# as there are no duplicates
#group_by(name, grp, fruit) %>%
#mutate(rn = row_number()) %>%
pivot_wider(names_from = grp, values_from = Value)
列タイプが混在する新しいデータに基づいて、「AB」などの値をそのままにしておく必要がある場合は、character
クラスに変換する必要があります
imap_dfr(all_data, ~
.x %>%
mutate_at(-1, as.character) %>%
mutate(grp = .y) %>%
pivot_longer(cols = -c(name, grp), names_to = "fruit",
values_to = "Value")) %>%
pivot_wider(names_from = grp, values_from = Value)
または、bind_rows
以前と同様の効率的なアプローチ(ただし、列タイプが異なるため、ここでは実行できません)
map_dfr(all_data, ~
.x %>%
mutate_at(-1, as.character), .id = 'grp') %>%
pivot_longer(cols = c(-name, -grp), names_to = "fruit",
values_to = "Value", values_drop_na = TRUE) %>%
pivot_wider(names_from = grp, values_from = Value)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加