我目前正在处理以下数据帧:
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)
但是我很难解释结果
提前谢谢你
这是使用dplyr
和tidyr
库的一种方法-
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
的行