从三个值创建交叉表

Create crosstab from three values

我有一个包含三个变量的数据框,我希望第一个变量是行名,第二个变量是列名,第三个变量是与这两个参数关联的值,NA或数据可能丢失的空白。这是 easy/possible 在 R 中做的吗?

示例输入

structure(list(
  Player = c("1","1","2","2","3","3","4","4","5","5","6"),

  Type = structure(c(2L, 1L, 2L, 1L, 2L, 1L,2L, 1L, 2L, 1L, 1L),
     .Label = c("Long", "Short"), class = "factor"),
     Yards = c("23","41","50","29","11","41","48","12","35","27","25")),

  .Names = c("Player", "Type", "Yards"),

  row.names = c(NA, 11L),
  class = "data.frame")

使用您提供的示例数据:

df <- structure(list(Player = c("1", "1", "2", "2", "3", "3", "4", "4", "5",
 "5", "6"), Type = structure(c(2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L),
 .Label = c("Long", "Short"), class = "factor"), 
 Yards = c("23", "41", "50", "29", "11", "41", "48", "12", "35", "27", "25")), 
 .Names = c("Player", "Type", "Yards"), row.names = c(NA, 11L), 
 class = "data.frame")

   Player  Type Yards
1       1 Short    23
2       1  Long    41
3       2 Short    50
4       2  Long    29
5       3 Short    11
6       3  Long    41
7       4 Short    48
8       4  Long    12
9       5 Short    35
10      5  Long    27
11      6  Long    25

dcast就能将两个变量制表。

library(reshape2)
df.cast <- dcast(df, Player~Type, value.var="Yards")

Player 列将成为一列,因此您需要做一些额外的工作,使其成为 data.frame

的行名称
rownames(df.cast) <- df.cast$Player
df.cast$Player <- NULL

  Long Short
1   41    23
2   29    50
3   41    11
4   12    48
5   27    35
6   25  <NA>