首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R:如何通过ID变量(作为新的数据框架)获得两个因素变量级别的公共计数(频率)

R:如何通过ID变量(作为新的数据框架)获得两个因素变量级别的公共计数(频率)
EN

Stack Overflow用户
提问于 2016-02-01 13:07:52
回答 3查看 2.4K关注 0票数 2

为了弄清楚这个问题,让我从我的数据框架的一个小例子开始。

代码语言:javascript
运行
复制
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_1R=2因子水平和Var_2C=3因子水平。

我想要一个新的数据框架,其中包含一个(RxC)+1=(2x3)+1变量,它包含所有因素级别组合的频率--对于ID变量中的每个级别,分别是这样的:

代码语言:javascript
运行
复制
      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变量。

编辑:有一个或多个变量的计算因子水平的解决方案,但我无法弄清楚如何对两个(或多个)变量的因素级别组合进行通用计数。当我得到答案时,对别人的解决办法现在似乎很容易,但我一个人无法做到。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-01 13:23:36

使用来自reshape包的dcast函数(或data.table,它增强了dcast函数的实现):

代码语言:javascript
运行
复制
library(reshape2)
dcast(DF, ID ~ paste(Var_1,Var_2,sep="."), fun.aggregate = length)

这意味着:

代码语言:javascript
运行
复制
      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
票数 1
EN

Stack Overflow用户

发布于 2016-02-01 13:16:09

我们可以使用paste创建一个Var_1和Var_2组合的变量,然后生成一个带有ID和新变量的应急表:

代码语言:javascript
运行
复制
table(DF$ID,paste(DF$Var_1,DF$Var_2,sep="."))

输出

代码语言:javascript
运行
复制
         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

要对表行进行排序,我们需要事先进行factor(DF$ID,levels=c("first","second","third","fourth"))

票数 1
EN

Stack Overflow用户

发布于 2016-02-01 13:16:54

试一试

代码语言:javascript
运行
复制
library(tidyr)
library(dplyr)

DF %>%
  unite(Var, Var_1, Var_2, sep = ".") %>%
  count(ID, Var) %>%
  spread(Var, n, fill = 0)

这意味着:

代码语言:javascript
运行
复制
#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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35131355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档