汇总和分组R中的行

htrmnn0y  于 2023-03-15  发布在  其他
关注(0)|答案(3)|浏览(143)

我是R的新手,目前正在R中处理一个数据框,如下所示。

City p54_1 p54_2 p54_3 p54_4 p54_5 p54_6 p54_7 p54_8 p54_9 p54_10 p54_11 p54_12
19   Apodaca     0     0     1     1     1     1     1     0     0      0      1      1
46   Apodaca     0     0     1     1     1     1     1     1     1      1      1      1
51   Apodaca     1     0     1     1     0     0     0     0     0      0      0      0
57   Apodaca     0     0     1     0     0     0     0     0     0      0      0      0
86   Apodaca     1     1     1     1     1     1     1     1     1      1      1      1
89   Apodaca     1     0     0     0     1     1     1     0     0      0      1      0
p54_13 p54_14
19      0      1
46      0      1
51      0      0
57      0      0
86      1      1
89      1      1

我正在处理几个城市和与它们相关的列。所有这些列都有编码的值,即0、1、8或9。我试图找出每个城市以及每个城市名称的所有列和行中有多少个“1“。
但是,我尝试的大多数R代码主要集中在分析和比较各个列,例如

nrow(subset(dataframe, City == "Apodaca" & p54_1 == 9)) for example,

或汇总其他数据点,如以下代码:

EAV21 %>%     group_by(City) %>% summarise(cnt = n()) %>% mutate(freq = formattable::percent (cnt/sum(cnt)))

其中显示以下内容

A tibble: 11 × 3
City                       cnt freq      
<chr>                    <int> <formttbl>
1 Apodaca                    351 9.06%     
2 Cadereyta Jiménez          353 9.11%     
3 García                     354 9.13%     
4 General Escobedo           354 9.13%     
5 Guadalupe                  354 9.13%      
6 Juárez                     354 9.13%     
7 Monterrey                  354 9.13%     
8 San Nicolás de los Garza   354 9.13%     
9 San Pedro Garza García     346 8.93%     
10 Santa Catarina             354 9.13%     
11 Santiago                   348 8.98%

这个表对于其他分析来说是相当庞大的,但是它没有显示每个城市的观测总量(“Municipio”;它只显示城市名称每次出现在数据框中的总数),但它接近我试图获得的结果。
我尝试过对每个城市名、每个列名和每个值重复nrow(subset(dataframe,City ==“cityname”& columnname == value)),并将这些结果添加到我自己在R中创建的变量中。虽然这肯定是可行的,但我确信一定有一种更干净的方法来计算我所寻求的。

什么样的代码可以让我获得每个城市名称行中出现的“0“和“1”的数量,以及p54_1到p54_14列中出现的“0”和“1”的数量,以获得它们的频率百分比?

bis0qfac

bis0qfac1#

我们可以这样做:
以长格式导入数据,然后使用count

library(dplyr)
library(tidyr)

df %>% 
  pivot_longer(-City) %>% 
  count(City, value)

 City    value     n
  <chr>   <int> <int>
1 Apodaca     0    40
2 Apodaca     1    44
bqf10yzr

bqf10yzr2#

假设您的 Dataframe 名为df,则可能的解决方案如下:

library(tidyverse)
df %>%
  # cast all `p*` columns longer:
  pivot_longer(starts_with("p")) %>%
  # for each `City` and `value` combination ...:
  group_by(City, value) %>%
  # ... count:
  summarise(N = n())
qlzsbp2j

qlzsbp2j3#

您可以将across()dplyr一起使用来跨列执行操作。例如,

df %>%
  mutate(
    cnt_1 = rowSums(across(-City) == 1),
    cnt_0 = rowSums(across(-City) == 0)
  )
#       City p54_1 p54_2 p54_3 p54_4 p54_5 p54_6 p54_7 p54_8 p54_9 p54_10 p54_11 p54_12 cnt_1 cnt_0
# 19 Apodaca     0     0     1     1     1     1     1     0     0      0      1      1     7     5
# 46 Apodaca     0     0     1     1     1     1     1     1     1      1      1      1    10     2
# 51 Apodaca     1     0     1     1     0     0     0     0     0      0      0      0     3     9
# 57 Apodaca     0     0     1     0     0     0     0     0     0      0      0      0     1    11
# 86 Apodaca     1     1     1     1     1     1     1     1     1      1      1      1    12     0
# 89 Apodaca     1     0     0     0     1     1     1     0     0      0      1      0     5     7

您可以接着使用%>% group_by(City)将各行的计数相加,等等。

相关问题