从数据框列创建数据框的 R 方法
R way to create dataframe from a dataframe columns
正在 R 中寻找一种从另一个数据框创建数据框的方法,其中 Col A 的值充当索引,Col B 中的每个唯一值都成为新数据框中的新列,其值为Col C 是新列中的值。
数据帧 1:
Col A
Col B
Col C
A
2011
1
B
2012
2
C
2013
3
D
2011
4
E
2012
5
D
2013
6
A
2013
7
结果:
Col A
2011
2012
2013
A
1
0
7
B
0
2
0
C
0
0
3
D
4
0
6
E
0
0
5
这是使用 reshape
的基础 R 选项
reshape(
df,
direction = "wide",
idvar = "ColA",
timevar = "ColB"
)
这给出了
ColA ColC.2011 ColC.2012 ColC.2013
1 A 1 NA 7
2 B NA 2 NA
3 C NA NA 3
4 D 4 NA 6
5 E NA 5 NA
data.table
选项 dcast
> dcast(setDT(df),ColA~ColB, value.var = "ColC")
ColA 2011 2012 2013
1: A 1 NA 7
2: B NA 2 NA
3: C NA NA 3
4: D 4 NA 6
5: E NA 5 NA
数据
> dput(df)
structure(list(ColA = c("A", "B", "C", "D", "E", "D", "A"), ColB = c(2011L,
2012L, 2013L, 2011L, 2012L, 2013L, 2013L), ColC = 1:7), class = "data.frame", row.names = c(NA,
-7L))
这是一个tidyverse
解决方案。
library(tidyverse)
df1 %>%
pivot_wider(
id_cols = Col.A,
names_from = Col.B,
values_from = Col.C,
values_fill = 0L
)
## A tibble: 5 x 4
# Col.A `2011` `2012` `2013`
# <chr> <int> <int> <int>
#1 A 1 0 7
#2 B 0 2 0
#3 C 0 0 3
#4 D 4 0 6
#5 E 0 5 0
数据
df1 <-
structure(list(Col.A = c("A", "B", "C", "D", "E", "D", "A"),
Col.B = c(2011L, 2012L, 2013L, 2011L, 2012L, 2013L, 2013L),
Col.C = 1:7), row.names = c(NA, -7L), class = "data.frame")
我们可以使用 xtabs
来自 base R
xtabs(Col.C ~ Col.A + Col.B, df1)
数据
df1 <- structure(list(Col.A = c("A", "B", "C", "D", "E", "D", "A"),
Col.B = c(2011L, 2012L, 2013L, 2011L, 2012L, 2013L, 2013L
), Col.C = 1:7), row.names = c(NA, -7L), class = "data.frame")
正在 R 中寻找一种从另一个数据框创建数据框的方法,其中 Col A 的值充当索引,Col B 中的每个唯一值都成为新数据框中的新列,其值为Col C 是新列中的值。
数据帧 1:
Col A | Col B | Col C |
---|---|---|
A | 2011 | 1 |
B | 2012 | 2 |
C | 2013 | 3 |
D | 2011 | 4 |
E | 2012 | 5 |
D | 2013 | 6 |
A | 2013 | 7 |
结果:
Col A | 2011 | 2012 | 2013 |
---|---|---|---|
A | 1 | 0 | 7 |
B | 0 | 2 | 0 |
C | 0 | 0 | 3 |
D | 4 | 0 | 6 |
E | 0 | 0 | 5 |
这是使用 reshape
reshape(
df,
direction = "wide",
idvar = "ColA",
timevar = "ColB"
)
这给出了
ColA ColC.2011 ColC.2012 ColC.2013
1 A 1 NA 7
2 B NA 2 NA
3 C NA NA 3
4 D 4 NA 6
5 E NA 5 NA
data.table
选项 dcast
> dcast(setDT(df),ColA~ColB, value.var = "ColC")
ColA 2011 2012 2013
1: A 1 NA 7
2: B NA 2 NA
3: C NA NA 3
4: D 4 NA 6
5: E NA 5 NA
数据
> dput(df)
structure(list(ColA = c("A", "B", "C", "D", "E", "D", "A"), ColB = c(2011L,
2012L, 2013L, 2011L, 2012L, 2013L, 2013L), ColC = 1:7), class = "data.frame", row.names = c(NA,
-7L))
这是一个tidyverse
解决方案。
library(tidyverse)
df1 %>%
pivot_wider(
id_cols = Col.A,
names_from = Col.B,
values_from = Col.C,
values_fill = 0L
)
## A tibble: 5 x 4
# Col.A `2011` `2012` `2013`
# <chr> <int> <int> <int>
#1 A 1 0 7
#2 B 0 2 0
#3 C 0 0 3
#4 D 4 0 6
#5 E 0 5 0
数据
df1 <-
structure(list(Col.A = c("A", "B", "C", "D", "E", "D", "A"),
Col.B = c(2011L, 2012L, 2013L, 2011L, 2012L, 2013L, 2013L),
Col.C = 1:7), row.names = c(NA, -7L), class = "data.frame")
我们可以使用 xtabs
来自 base R
xtabs(Col.C ~ Col.A + Col.B, df1)
数据
df1 <- structure(list(Col.A = c("A", "B", "C", "D", "E", "D", "A"),
Col.B = c(2011L, 2012L, 2013L, 2011L, 2012L, 2013L, 2013L
), Col.C = 1:7), row.names = c(NA, -7L), class = "data.frame")