我有这个数据框:
> df <- data.frame(o = c(0,1,1,1), e = c(1, 1, 1, 1))
> df
o e
1 0 1
2 1 1
3 1 1
4 1 1
我希望使用某些规则来获取数量。我试过这个:
out <- df %>%
mutate(L = case_when(o == 1 & e == 1 ~ 'a',
o == 0 & e == 1 ~ 'b',
o == 1 & e == 0 ~ 'c',
o == 0 & e == 0 ~ 'd')) %>%
group_by(L) %>%
summarise(n())
通过这样做我节省了很多时间,但我明白了:
> out
# A tibble: 3 x 2
l `n()`
<chr> <int>
1 a 3
2 b 1
如何在c = 0
的创建代码中包含0个值(d = 0
和out
),以便为任何字母a
{{{ 1}},b
或c
)?
答案 0 :(得分:1)
data.frame(table(factor(x = paste(df$o, df$e),
levels = c("1 1", "0 1", "1 0", "0 0"),
labels = c("a", "b", "c", "d"))))
# Var1 Freq
#1 a 3
#2 b 1
#3 c 0
#4 d 0
答案 1 :(得分:1)
由于此标记为dplyr
,因此您可以将代码修改为:
out <- df %>%
mutate(L = factor(case_when(o == 1 & e == 1 ~ 'a',
o == 0 & e == 1 ~ 'b',
o == 1 & e == 0 ~ 'c',
o == 0 & e == 0 ~ 'd'),
levels = c('a', 'b', 'c', 'd'))) %>%
select(L) %>% table(L = .) %>% data.frame
正如其他人指出的那样,关键是要考虑因素L
并添加所有必要的等级。
#out
# L Freq
#1 a 3
#2 b 1
#3 c 0
#4 d 0