转换长格式为宽格式的简便方法及计数

12

我有以下数据集:

sample.data <- data.frame(Step = c(1,2,3,4,1,2,1,2,3,1,1),
                          Case = c(1,1,1,1,2,2,3,3,3,4,5),
                          Decision = c("Referred","Referred","Referred","Approved","Referred","Declined","Referred","Referred","Declined","Approved","Declined"))

sample.data

   Step Case Decision
1     1    1 Referred
2     2    1 Referred
3     3    1 Referred
4     4    1 Approved
5     1    2 Referred
6     2    2 Declined
7     1    3 Referred
8     2    3 Referred
9     3    3 Declined
10    1    4 Approved
11    1    5 Declined
在R中,是否可以将此转换为宽表格格式,其中决策出现在标题中,每个单元格的值为出现次数的计数,例如:
Case    Referred    Approved    Declined
1          3           1            0
2          1           0            1
3          2           0            1
4          0           1            0
5          0           0            1

2
reshape2 包的 dcast 函数中,聚合参数默认为 lenght(=计数)。因此,在您的情况下,应为:dcast(sample.data, Case ~ Decision) - Jaap
谢谢@Jaap。我一定会更仔细地检查dcast函数,并学习它的用法。尽管“length”(=计数)让我困惑了一分钟。 - dGecko
4个回答

15

reshape2包中的dcast函数中的聚合参数默认为length(=计数)。在data.table包中实现了dcast函数的改进版本。因此,在您的情况下,这将是:

library('reshape2') # or library('data.table')
newdf <- dcast(sample.data, Case ~ Decision)

或者显式地使用参数:

newdf <- dcast(sample.data, Case ~ Decision,
               value.var = "Decision", fun.aggregate = length)

这将得到以下数据框:

> newdf
  Case Approved Declined Referred
1    1        1        0        3
2    2        0        1        1
3    3        0        1        2
4    4        1        0        0
5    5        0        1        0

如果你不指定聚合函数,则会收到警告,告诉你dcast正在使用lenght作为默认值。


10
你可以通过简单的table()语句来实现这一点。你可以尝试设置因子水平,以使你的响应达到你想要的效果。

你可以通过一个简单的table()语句来完成此操作。您可以玩弄因子级别的设置,以使您的响应达到所需效果。

sample.data$Decision <- factor(x = sample.data$Decision,
                               levels = c("Referred","Approved","Declined"))

table(Case = sample.data$Case,sample.data$Decision)

Case Referred Approved Declined
   1        3        1        0
   2        1        0        1
   3        2        0        1
   4        0        1        0
   5        0        0        1

如果 sample.data 有两个因子变量,那么这个怎么工作呢?table(Case = sample.data$Case,sample.data$Decision,sample.data$Reason) 的结果会让人感到困惑。 - dGecko
虽然这实际上是一个单独的问题,但基本上可以使用as.data.frame将表格转换为数据框。 - TARehman
抱歉。我会为此提出一个新问题。 - dGecko
好的使用 table 加一。 - akrun

6
这里是一个使用 dplyrtidyr 的方法:
if (!require("pacman")) install.packages("pacman")
pacman::p_load(dplyr, tidyr)

sample.data %>%
    count(Case, Decision) %>%
    spread(Decision, n, fill = 0)

##    Case Approved Declined Referred
##   (dbl)    (dbl)    (dbl)    (dbl)
## 1     1        1        0        3
## 2     2        0        1        1
## 3     3        0        1        2
## 4     4        1        0        0
## 5     5        0        1        0

3
我们可以使用基本的R语言中的`xtabs`函数进行数据透视。
xtabs(Step~Case+Decision, transform(sample.data, Step=1))
#      Decision
#  Case Approved Declined Referred
#  1        1        0        3
#  2        0        1        1
#  3        0        1        2
#  4        1        0        0
#  5        0        1        0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接