频率表,二进制变量,r. 条件



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

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辆车和第3辆车。我想做的是,得到一个类似频率表的东西,它基于下雨或不下雨的情况以及使用的汽车的组合。总的来说,我们可以得到以下汽车组合:

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

(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)

但是我很难解释结果

提前谢谢你

这是使用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的行

最新更新