R:如何通过 ID 变量(作为新数据框)获得两个因子变量水平的共同计数(频率)
R: How to get common counts (frequency) of levels of two factor variables by ID Variable (as new data frame)
为了弄清楚问题,让我从我的数据框的一个小例子开始。
ID <- c(rep("first", 2), rep("second", 4), rep("third",1), rep("fourth", 3))
Var_1 <- c(rep("A",2), rep("B", 2), rep("A",3), rep("B", 2), "A")
Var_2 <- c(rep("C",2), rep("D",3) , rep("C",2), rep("E",2), "D")
DF <- data.frame(ID, Var_1, Var_2)
> DF
ID Var_1 Var_2
1 first A C
2 first A C
3 second B D
4 second B D
5 second A D
6 second A C
7 third A C
8 fourth B E
9 fourth B E
10 fourth A D
有一个 ID
因子变量和两个因子变量 Var_1
具有 R=2
因子水平和 Var_2
具有 C=3
因子水平。
我想得到一个新的数据框,其中 (RxC)+1=(2x3)+1
个变量具有所有因子水平组合的频率 - 分别针对 ID 变量中的每个水平,看起来像这样:
ID A.C A.D A.E B.C B.D B.E
1 first 2 0 0 0 0 0
2 second 1 1 0 0 2 0
3 third 1 0 0 0 0 0
4 fourth 0 1 0 0 0 2
我尝试了几个功能,但结果与此相去甚远,所以它们甚至不值一提。在原始数据框中,我应该得到 (6x9)+1=55 个变量。
编辑:有单独计算一个或多个变量的因子水平的解决方案,但我无法弄清楚如何对两个(或更多)变量的因子水平组合进行共同计数。当我得到答案时,现在对其他人实施解决方案似乎很容易,但我自己无法实现。
我们可以使用 paste
来创建一个组合 Var_1 和 Var_2 的变量,然后生成一个带有 ID 和新变量的偶然性 table:
table(DF$ID,paste(DF$Var_1,DF$Var_2,sep="."))
输出
A.C A.D B.D B.E
first 2 0 0 0
fourth 0 1 0 2
second 1 1 2 0
third 1 0 0 0
要对 table 行进行排序,我们需要事先 factor(DF$ID,levels=c("first","second","third","fourth"))
。
尝试
library(tidyr)
library(dplyr)
DF %>%
unite(Var, Var_1, Var_2, sep = ".") %>%
count(ID, Var) %>%
spread(Var, n, fill = 0)
给出:
#Source: local data frame [4 x 5]
#
# ID A.C A.D B.D B.E
# (fctr) (dbl) (dbl) (dbl) (dbl)
#1 first 2 0 0 0
#2 fourth 0 1 0 2
#3 second 1 1 2 0
#4 third 1 0 0 0
使用 reshape 包中的 dcast
函数(或 data.table 具有增强的实现dcast
函数):
library(reshape2)
dcast(DF, ID ~ paste(Var_1,Var_2,sep="."), fun.aggregate = length)
给出:
ID A.C A.D B.D B.E
1 first 2 0 0 0
2 fourth 0 1 0 2
3 second 1 1 2 0
4 third 1 0 0 0
为了弄清楚问题,让我从我的数据框的一个小例子开始。
ID <- c(rep("first", 2), rep("second", 4), rep("third",1), rep("fourth", 3))
Var_1 <- c(rep("A",2), rep("B", 2), rep("A",3), rep("B", 2), "A")
Var_2 <- c(rep("C",2), rep("D",3) , rep("C",2), rep("E",2), "D")
DF <- data.frame(ID, Var_1, Var_2)
> DF
ID Var_1 Var_2
1 first A C
2 first A C
3 second B D
4 second B D
5 second A D
6 second A C
7 third A C
8 fourth B E
9 fourth B E
10 fourth A D
有一个 ID
因子变量和两个因子变量 Var_1
具有 R=2
因子水平和 Var_2
具有 C=3
因子水平。
我想得到一个新的数据框,其中 (RxC)+1=(2x3)+1
个变量具有所有因子水平组合的频率 - 分别针对 ID 变量中的每个水平,看起来像这样:
ID A.C A.D A.E B.C B.D B.E
1 first 2 0 0 0 0 0
2 second 1 1 0 0 2 0
3 third 1 0 0 0 0 0
4 fourth 0 1 0 0 0 2
我尝试了几个功能,但结果与此相去甚远,所以它们甚至不值一提。在原始数据框中,我应该得到 (6x9)+1=55 个变量。
编辑:有单独计算一个或多个变量的因子水平的解决方案,但我无法弄清楚如何对两个(或更多)变量的因子水平组合进行共同计数。当我得到答案时,现在对其他人实施解决方案似乎很容易,但我自己无法实现。
我们可以使用 paste
来创建一个组合 Var_1 和 Var_2 的变量,然后生成一个带有 ID 和新变量的偶然性 table:
table(DF$ID,paste(DF$Var_1,DF$Var_2,sep="."))
输出
A.C A.D B.D B.E
first 2 0 0 0
fourth 0 1 0 2
second 1 1 2 0
third 1 0 0 0
要对 table 行进行排序,我们需要事先 factor(DF$ID,levels=c("first","second","third","fourth"))
。
尝试
library(tidyr)
library(dplyr)
DF %>%
unite(Var, Var_1, Var_2, sep = ".") %>%
count(ID, Var) %>%
spread(Var, n, fill = 0)
给出:
#Source: local data frame [4 x 5]
#
# ID A.C A.D B.D B.E
# (fctr) (dbl) (dbl) (dbl) (dbl)
#1 first 2 0 0 0
#2 fourth 0 1 0 2
#3 second 1 1 2 0
#4 third 1 0 0 0
使用 reshape 包中的 dcast
函数(或 data.table 具有增强的实现dcast
函数):
library(reshape2)
dcast(DF, ID ~ paste(Var_1,Var_2,sep="."), fun.aggregate = length)
给出:
ID A.C A.D B.D B.E
1 first 2 0 0 0
2 fourth 0 1 0 2
3 second 1 1 2 0
4 third 1 0 0 0