首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算一个列中变量的多个类别,并通过创建新列来报告这些变量

计算一个列中变量的多个类别,并通过创建新列来报告这些变量
EN

Stack Overflow用户
提问于 2019-09-14 17:47:25
回答 3查看 107关注 0票数 0

假设我有两列的数据(Df)。下面给出了其中的一部分。

代码语言:javascript
复制
  familyGroup Sex
 1    601       2
 2    601       1
 3    601       2
 4    601       1
 5    601       1
 6    601       2
 7    602       2
 8    602       1
 9    602       2
10    602       1
11    602       1
12    602       1

在性别栏<1代表male>,<2代表female>。我想要一个familyGroup的男性和女性的总数,并在两个新的列中报告(比如在男性和女性下面)

我使用tidyverse包中的dplyr,用group_bysummarymutate做了一些试验

我使用dplyr尝试了以下代码。然而,输出并不像预期的那样。

代码语言:javascript
复制
df %>%
  group_by(familyGroup, Sex) %>%
  summarise(male = sum(Sex==1), female = sum(Sex == 2)) %>%
  select(familyGroup, male, female)
# A tibble: 74 x 3
# Groups:   familyGroup [40]
  familyGroup  male female
   <fct>       <int>  <int>
 1     601      3      0
 2     601      0      3
 3     602      4      0
 4     602      0      2

预期的输出如下所示

代码语言:javascript
复制
familyGroup   male  female
        601    3     3
        602    4     2
EN

Stack Overflow用户

发布于 2019-09-14 20:05:22

您可以使用data.table包中的dcast执行此操作,如下所示:

代码语言:javascript
复制
library(data.table)
library(dplyr)
dt <- read.table(text = " familyGroup Sex
 1    601       2
 2    601       1
 3    601       2
 4    601       1
 5    601       1
 6    601       2
 7    602       2
 8    602       1
 9    602       2
10    602       1
11    602       1
12    602       1")

dt <- data.table(dt)

dt[, 
    sexLabel := dplyr::case_when(
      Sex == 1 ~ "male",
      Sex == 2 ~ "female",
      TRUE ~ "(unknown)"
    )
]

res <- dcast(
  formula = familyGroup ~ sexLabel,  
  data = dt, 
  fun.aggregate = length,
  value.var = "Sex"
)
res
#       familyGroup female male
# 1:         601      3    3
# 2:         602      2    4
票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57934302

复制
相关文章

相似问题

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