从数据框列创建数据框的 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")