私は自分の研究に適合した大きなデータセットを処理しています。次のように、4つの観測値(レコード)と5つの列があるとします。
x <- data.frame("ID" = c(1, 2, 3, 4),
"group1" = c("A", NA, "B", NA),
"group2" = c("B", "A", NA, "C"),
"hours1" = c(3, NA, 5, NA),
"hours2" = c(1, 2, NA, 5))
> x
ID group1 group2 hours1 hours2
1 A B 3 1
2 <NA> A NA 2
3 B <NA> 5 NA
4 <NA> C NA 5
「group1」と「group2」はA、B、Cの文字値を含む参照列であり、最後の2つの列「hours1」と「hours2」は明らかに時間を示す数値です。
列「group1」は列「hours1」に対応します。同様に、「group2」は「2時間目」に対応します。
次のように、「hours1」と「hours2」の値に一致する参照列の値A、B、およびCに従って複数の列を作成したいと思います。
ID group1 group2 hours1 hours2 A B C
1 A B 3 1 3 1 NA
2 <NA> A NA 2 2 NA NA
3 B <NA> 5 NA NA 5 NA
4 <NA> C NA 5 NA NA 5
たとえば、ID 1の「group1」にはAがあり、「A」列の下にある「hours1」の3に対応します。ID 3の「group1」にはBがあり、「B」列の下にある「hours1」の5に対応します。「グループ2」では、ID 4にはCがあり、「C」列の下にあるhours2の5に対応します。
Rを使用してそれを行う方法はありますか?
1つの方法は、すべての「時間」列を1つの列に結合し、「グループ」列を別の列に結合することです。これは、を使用して実行できますpivot_longer
。その後、ワイドフォーマットのデータを取得し、元のデータと結合することができます。
library(dplyr)
library(tidyr)
x %>%
pivot_longer(cols = -ID,
names_to = c('.value'),
names_pattern = '(.*?)\\d+',
values_drop_na = TRUE) %>%
pivot_wider(names_from = group, values_from = hours) %>%
left_join(x, by = 'ID') %>%
select(ID, starts_with('group'), starts_with('hour'), everything())
# A tibble: 4 x 8
# ID group1 group2 hours1 hours2 A B C
# <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 A B 3 1 3 1 NA
#2 2 NA A NA 2 2 NA NA
#3 3 B NA 5 NA NA 5 NA
#4 4 NA C NA 5 NA NA 5
OPのデータセットの場合、コードを少し変更して、目的の結果を得ることができます。
zz %>%
pivot_longer(cols = -id,
names_to = c('.value'),
names_pattern = '(.*)_',
values_drop_na = TRUE) %>%
arrange(fu2a) %>%
pivot_wider(names_from = fu2a, values_from = fu2b) %>%
left_join(zz, by = 'id') %>%
select(id, starts_with('fu2a'), starts_with('fu2b'), everything())
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加