如何将 R 数据从 long-ish 转换为 wide-ish
How to transform R data from long-ish to wide-ish
我正在使用 R 尝试将我的数据框从 "long-ish" 转换为 "wide-ish",但我徒劳地搜索了一个使用与我的结构相似的数据的答案。这是我的数据:
| ID | NAME | V1 | V2 | V3 |
|------|------|-------|----:|-----:|
| 1001 | Bob | Red | 302 | 0.50 |
| 1001 | Bob | Blue | 737 | 0.50 |
| 1002 | Jim | Red | 432 | 0.14 |
| 1002 | Jim | Blue | 643 | 0.60 |
| 1002 | Jim | Green | 34 | 0.46 |
| 1006 | Dan | Red | 876 | 1.25 |
这就是我希望最终数据(宽)的样子:
| ID | NAME | V2.Red | V2.Blue | V2.Green | V3.Red | V3.Blue | V3.Green |
|------|------|-------:|--------:|---------:|-------:|--------:|---------:|
| 1001 | Bob | 302 | 737 | N/A | 0.50 | 0.50 | N/A |
| 1002 | Jim | 432 | 643 | 34 | 0.14 | 0.60 | 0.46 |
| 1006 | Dan | 876 | N/A | N/A | 1.25 | N/A | N/A |
所以,基本上,我将所有相同 ID 的行折叠成一行(带有随附的 NAME),以便总行数等于唯一 ID 值的数量。
然后我使用 V1 的唯一值创建与 V1 中的唯一值乘以 "extra variables"--V2、V3 的数量一样多的列。 (我还有很多V2和V3类型的变量。
提前致谢!
我们可以使用新 tidyr
中的 pivot_wider
tidyr::pivot_wider(df, names_from = V1, values_from = c(V2, V3))
# ID NAME V2_Red V2_Blue V2_Green V3_Red V3_Blue V3_Green
# <int> <fct> <int> <int> <int> <dbl> <dbl> <dbl>
#1 1001 Bob 302 737 NA 0.5 0.5 NA
#2 1002 Jim 432 643 34 0.14 0.6 0.46
#3 1006 Dan 876 NA NA 1.25 NA NA
数据
df <- structure(list(ID = c(1001L, 1001L, 1002L, 1002L, 1002L, 1006L
), NAME = structure(c(1L, 1L, 3L, 3L, 3L, 2L), .Label = c("Bob",
"Dan", "Jim"), class = "factor"), V1 = structure(c(3L, 1L, 3L,
1L, 2L, 3L), .Label = c("Blue", "Green", "Red"), class = "factor"),
V2 = c(302L, 737L, 432L, 643L, 34L, 876L), V3 = c(0.5, 0.5,
0.14, 0.6, 0.46, 1.25)), class = "data.frame", row.names = c(NA, -6L))
为了完整起见,这里有一个 data.table
解决方案
library( data.table )
dcast( setDT(df), ID + NAME ~ V1, value.var = c("V2","V3"), sep = "." )
# ID NAME V2.Blue V2.Green V2.Red V3.Blue V3.Green V3.Red
# 1: 1001 Bob 737 NA 302 0.5 NA 0.50
# 2: 1002 Jim 643 34 432 0.6 0.46 0.14
# 3: 1006 Dan NA NA 876 NA NA 1.25
我正在使用 R 尝试将我的数据框从 "long-ish" 转换为 "wide-ish",但我徒劳地搜索了一个使用与我的结构相似的数据的答案。这是我的数据:
| ID | NAME | V1 | V2 | V3 |
|------|------|-------|----:|-----:|
| 1001 | Bob | Red | 302 | 0.50 |
| 1001 | Bob | Blue | 737 | 0.50 |
| 1002 | Jim | Red | 432 | 0.14 |
| 1002 | Jim | Blue | 643 | 0.60 |
| 1002 | Jim | Green | 34 | 0.46 |
| 1006 | Dan | Red | 876 | 1.25 |
这就是我希望最终数据(宽)的样子:
| ID | NAME | V2.Red | V2.Blue | V2.Green | V3.Red | V3.Blue | V3.Green |
|------|------|-------:|--------:|---------:|-------:|--------:|---------:|
| 1001 | Bob | 302 | 737 | N/A | 0.50 | 0.50 | N/A |
| 1002 | Jim | 432 | 643 | 34 | 0.14 | 0.60 | 0.46 |
| 1006 | Dan | 876 | N/A | N/A | 1.25 | N/A | N/A |
所以,基本上,我将所有相同 ID 的行折叠成一行(带有随附的 NAME),以便总行数等于唯一 ID 值的数量。
然后我使用 V1 的唯一值创建与 V1 中的唯一值乘以 "extra variables"--V2、V3 的数量一样多的列。 (我还有很多V2和V3类型的变量。
提前致谢!
我们可以使用新 tidyr
pivot_wider
tidyr::pivot_wider(df, names_from = V1, values_from = c(V2, V3))
# ID NAME V2_Red V2_Blue V2_Green V3_Red V3_Blue V3_Green
# <int> <fct> <int> <int> <int> <dbl> <dbl> <dbl>
#1 1001 Bob 302 737 NA 0.5 0.5 NA
#2 1002 Jim 432 643 34 0.14 0.6 0.46
#3 1006 Dan 876 NA NA 1.25 NA NA
数据
df <- structure(list(ID = c(1001L, 1001L, 1002L, 1002L, 1002L, 1006L
), NAME = structure(c(1L, 1L, 3L, 3L, 3L, 2L), .Label = c("Bob",
"Dan", "Jim"), class = "factor"), V1 = structure(c(3L, 1L, 3L,
1L, 2L, 3L), .Label = c("Blue", "Green", "Red"), class = "factor"),
V2 = c(302L, 737L, 432L, 643L, 34L, 876L), V3 = c(0.5, 0.5,
0.14, 0.6, 0.46, 1.25)), class = "data.frame", row.names = c(NA, -6L))
为了完整起见,这里有一个 data.table
解决方案
library( data.table )
dcast( setDT(df), ID + NAME ~ V1, value.var = c("V2","V3"), sep = "." )
# ID NAME V2.Blue V2.Green V2.Red V3.Blue V3.Green V3.Red
# 1: 1001 Bob 737 NA 302 0.5 NA 0.50
# 2: 1002 Jim 643 34 432 0.6 0.46 0.14
# 3: 1006 Dan NA NA 876 NA NA 1.25