【发布时间】:2020-12-27 01:54:05
【问题描述】:
我有一个数据框 df,我想确定 col1 中满足 col2 中的条件的唯一值的比例。
set.seed(137)
df <- data.frame(col1 = sample(LETTERS, 100, TRUE),
col2 = sample(-75:75, 100, TRUE),
col3 = sample(-75:75, 100, TRUE))
df$col2[c(23, 48, 78)] <- NA
df$col3[c(37, 68, 81)] <- NA
例如,我想在col2 中找到col2 中的所有唯一值,这些值在-10 到10 的范围内。
df %>%
mutate(unqCol1 = n_distinct(col1)) %>%
group_by(col1) %>%
mutate(freq = sum(between(col2, -10, 10), na.rm = TRUE)) %>%
filter(freq > 0) %>% distinct(col1, unqCol1) %>%
ungroup() %>%
summarise(nrow(.)/unqCol1) %>%
unique()
导致:
# A tibble: 1 x 1
`nrow(.)/unqCol1`
<dbl>
1 0.423
虽然上面的代码 sn-p 不是一种有效的方法,但我尝试在单个管道命令中实现结果,它为我提供了正确的输出(任何聪明的重写上述代码的方法非常值得赞赏)。我已经使用基本 R 方法重新确认了输出:
length(unique(df$col1[df$col2 >= -10 & df$col2 <= 10 & !is.na(df$col2)]))/length(unique(df$col1))
我想在一个函数中重写上面的 dplyr 代码,以便可以使用范围的多个 n 值(这里:n=10)复制它(也适用于多列)。这可能吗?或者我应该像 apply-family 想法那样在代码本身(没有函数)中传递多个值?
【问题讨论】: