【问题标题】:Frequency Table, binary variable,condition in r频率表,二进制变量,r 中的条件
【发布时间】:2025-11-28 11:25:01
【问题描述】:

我目前正在处理以下数据框:

     ID         Person        Rain             car.1   cars.2  car.3  car.4
1    31         1             no rain            1      0       1      0
2    31         1             no rain            0      1       0      0
3    31         1             rain               1      1       0      1
4    31         1             rain               0      0       0      0
5    31         1             rain               0      1       0      1
6    32         2             no rain            0      0       0      0
7    32         2             no rain            1      1       1      1
8    32         2             rain               0      0       0      0
9    32         2             no rain            1      1       0      1
10   32         2             rain               0      0       0      0
11   33         3             no rain            1      1       1      1

数据框的含义如下: 每个人有 5 行,其中人说它使用了哪辆车,例如人 1 使用了汽车 1 和汽车 3。 我想要做的是,根据是否下雨以及所用汽车的组合,得到一个频率表之类的东西。 总的来说,我们可以获得以下汽车组合:

(car1), (car2), (car3), (car4), (car1, car2), (car1, car3), (car1, car4), (car2, car3), (car2, car4), (汽车3, 汽车4),

(car1, car2, car3),......(car1, car2, car3, car4)

我想要这样的东西:

                         rain    no rain
car1                       1         4
car2                       1         3
car3                       0         3
car4                       2         3
car1, car2                 1         3
.....
car1, car2, car3, car4     0         1


下雨时car1用了一次,没下雨时car1用了4次。

我尝试了类似的方法:

xtabs( ~Rain + car.1 + car.2 + car.3 + car.4 ,data = df)

但我无法解释结果

提前谢谢你

【问题讨论】:

    标签: r frequency


    【解决方案1】:

    这是使用 dplyrtidyr 库的一种方法 -

    library(dplyr)
    library(tidyr)
    
    cols <- grep('car', names(df), value = TRUE)
    
    df %>%
      rowwise() %>%
      mutate(result = toString(cols[c_across(starts_with('car')) == 1])) %>%
      ungroup %>%
      filter(result != '') %>%
      count(result, Rain) %>%
      pivot_wider(names_from = Rain, values_from = n, values_fill = 0)
    

    逻辑是为result 中的每一行创建一个逗号分隔的字符串。如果一列的值为 1,我们将该列名称包含在 result 中。删除每个组合出现全 0 和 count 的行。

    【讨论】:

    • 非常感谢,不幸的是这不起作用,因为我得到以下结果:# A tibble: 0 x 2 # … with 2 variables: result , n
    • 也许你的变量之一被称为别的东西。如果您以可重现的格式提供数据,会更容易提供帮助。阅读how to give a reproducible example
    最近更新 更多