dplyr:当我需要它们时,如何避免硬编码变量名?

时间:2016-07-02 15:43:19

标签: r dplyr

这是一个简单的例子。变量只有三个,但可能更多。我想替换每个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

2 个答案:

答案 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