首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建带文本计数的枢轴表

如何创建带文本计数的枢轴表
EN

Stack Overflow用户
提问于 2021-03-08 22:04:56
回答 3查看 49关注 0票数 0

我正在使用R上的枢轴表,我一直在尝试做一些事情,但我做不到。我有这样的事情:

tb1

代码语言:javascript
复制
ESM     tipo_Entrega
name1   acuerdo
name1   no_acuerdo
name2   acuerdo
name2   acuerdo
name3   no_acuerdo
name3   acuerdo

我需要这张桌子像这样:tb2

代码语言:javascript
复制
esm    acuerdo  no_acuerdo
name1     1          1
name2     2          0
name3     1          1

我一直在使用dplyr,并且我这样做了:

代码语言:javascript
复制
pvt1 <- rpen %>% group_by(ESM,Tipo.Entrega) %>% summarise(Count = n())

结果:在这里输入图像描述

代码语言:javascript
复制
esm    tipo.entrega   count
name1   acuerdo         1
name1   no_acuerdo      1
name2   acuerdo         2
name2   no_acuerdo      0
name3   acuerdo         1
name3   no_acuerdo      1

我也试过这样做:

代码语言:javascript
复制
pvt1 <- rpen[ , c(9,25)]
pvt1 <- mutate(pvt1 ,  Acu = ifelse(tdcondes$Tipo.Entrega=="ACUERDO", "1", "0"))
pvt1 <- mutate(pvt1 ,  No_Acu = ifelse(tdcondes$Tipo.Entrega=="NO ACUERDO", "1", "0"))
pvt1 <- pvt1 [ , c(1,3:4)]

pvt1 <- pvt1 %>% group_by(ESM) %>% summarise(Acu = sum(Acu), No_Acu = sum(No_Acu))

我得到了一个错误:

代码语言:javascript
复制
Error: Problem with `summarise()` input `Acu`.
x 'type' (character) de argumento no válido
i Input `Acu` is `sum(Acu)`.
i The error occurred in group 1: ESM = "1006 - BATALLÓN DE INFANTERÍA MECANIZADO NO 05 \"GENERAL JOSE MARIA CORDOVA".
Run `rlang::last_error()` to see where the error occurred.

然后我尝试使用包pivottabler,我得到了我想要的结果,但是第一列没有名称,我需要将这个信息与另一列的信息进行比较,在第一列中没有名称,它是不可确定的.我不知道该怎么办..。救命啊!

在这里输入图像描述

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-08 22:16:42

这个怎么样:

代码语言:javascript
复制
library(tidyr)
library(dplyr)
dat <- tibble::tribble(
  ~ESM,     ~tipo_Entrega,
"name1",    "acuerdo",
"name1",    "no_acuerdo",
"name2",    "acuerdo",
"name2",    "acuerdo",
"name3",    "no_acuerdo",
"name3",    "acuerdo")

dat %>% 
  group_by(tipo_Entrega, ESM) %>% 
  summarise(n=n()) %>% 
  pivot_wider(names_from="tipo_Entrega", values_from="n", values_fill=0)
# # A tibble: 3 x 3
#   ESM   acuerdo no_acuerdo
#   <chr>   <int>      <int>
# 1 name1       1          1
# 2 name2       2          0
# 3 name3       1          1
票数 2
EN

Stack Overflow用户

发布于 2021-03-08 22:20:00

一个带有table + reshape的R基选项

代码语言:javascript
复制
reshape(
  data.frame(table(df)),
  direction = "wide",
  idvar = "ESM",
  timevar = "tipo_Entrega"
)

给出

代码语言:javascript
复制
    ESM Freq.acuerdo Freq.no_acuerdo
1 name1            1               1
2 name2            2               0
3 name3            1               1

带有data.tabledcast选项

代码语言:javascript
复制
dcast(setDT(df), ESM ~ tipo_Entrega)

给出

代码语言:javascript
复制
     ESM acuerdo no_acuerdo
1: name1       1          1
2: name2       2          0
3: name3       1          1
票数 2
EN

Stack Overflow用户

发布于 2021-03-08 22:30:16

您可以使用来自pivot_wider包的tidyr来完成所有这些操作:

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

df %>%
  tidyr::pivot_wider(id_cols = ESM,
                     names_from = tipo_Entrega,
                     values_from = tipo_Entrega,
                     values_fn = length,
                     values_fill = 0)

如果您不希望ESM在您的最终数据集中,您可以始终将它的输出(%>%)输送到dplyr::select(-ESM)

输出

代码语言:javascript
复制
 ESM   acuerdo no_acuerdo
  <chr>   <int>      <int>
1 name1       1          1
2 name2       2          0
3 name3       1          1

数据

代码语言:javascript
复制
df <- structure(list(ESM = c("name1", "name1", "name2", "name2", "name3", 
                             "name3"), tipo_Entrega = c("acuerdo", "no_acuerdo", "acuerdo", 
                                                        "acuerdo", "no_acuerdo", "acuerdo")), class = "data.frame", row.names = c(NA, 
                                                                                                                                  -6L))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66537909

复制
相关文章

相似问题

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