这是一个简单的例子。变量只有三个,但可能更多。我想替换每个c(X1,X2,X3)
,但找不到一个。
library(dplyr)
library(MASS)
df <- data.frame(expand.grid(data.frame(matrix(rep(1:7,3),ncol=3))))
df1 <- df %>%
rowwise() %>%
filter(length(unique(c(X1,X2,X3)))==3)
df1 %>%
rowwise() %>%
filter(max(c(X1,X2,X3))- min(c(X1,X2,X3)) == 2) %>%
ungroup() %>%
summarise(res = n()/ nrow(df1)) %>%
unlist %>%
as.fractions
答案 0 :(得分:2)
似乎everything()
(新完全导出)应该可以解决问题,但事实并非如此。特别是如果您要对所有列进行大量操作,那么创建一个包含每行向量的列表列可能是值得的,您可以在其上轻松调用unique
,{{1这里汇集了max
,尽管你可以对purrr
做同样的事情:
apply(df, 1, list) %>% lapply(unlist)
答案 1 :(得分:2)
我们也可以使用data.table
library(data.table)
res <- setDT(df)[df[ ,uniqueN(unlist(.SD))==3 , 1:nrow(df)]$V1][,
sum(do.call(pmax, .SD)- do.call(pmin, .SD) ==2)/.N]
as.fractions(res)
#[1] 1/7
如果我们需要使用dplyr
library(dplyr)
df1 <- df %>%
rowwise() %>%
do(data.frame(.,i1= n_distinct(unlist(.))==3)) %>%
filter(i1) %>%
dplyr::select(-i1)
df1 %>%
do(data.frame(., i2 = do.call(pmax, .) - do.call(pmin, .) == 2)) %>%
filter(i2) %>%
ungroup() %>%
summarise(n = n()/nrow(df1)) %>%
unlist %>%
as.fractions
# n
#1/7