1

我有一个data.frame我想(按行)将子集划分为(重叠)“批次”,然后将purrr:::map这些批次划分为一个函数。在下面的示例中,ddata.frame我想要子集和批处理:

set.seed(19)
n1 <- data.frame(c0= "N",c1 = rep("A",4),c2 = rep(c("i","j"),2), num = rnorm(4))
n2 <- data.frame(c0= "N", c1 = rep("B",6),c2 = rep(c("i","j"),3), num = rnorm(3))
y1 <- data.frame(c0 = "Y", c1 = rep("A",2),c2 = c("i","j"), num = rnorm(2))
y2 <- data.frame(c0 = "Y", c1 = rep("B",4),c2 = rep(c("i","j"),each = 2), num = rnorm(2))

d <- rbind(y1,y2,n1,n2)

这是d

#   c0 c1  c2      num
# 1  Y  A  i -0.7447795
# 2  Y  A  j -0.2597870
# 3  Y  B  i -0.1830838
# 4  Y  B  i  0.5186300
# 5  Y  B  j -0.1830838
# 6  Y  B  j  0.5186300
# 7  N  A  i -1.1894537
# 8  N  A  j  0.3885812
# 9  N  A  i -0.3443333
# 10 N  A  j -0.5478961
# 11 N  B  i  0.9806622
# 12 N  B  j -0.2366460
# 13 N  B  i  0.8097397
# 14 N  B  j  0.9806622
# 15 N  B  i -0.2366460
# 16 N  B  j  0.8097397

子集化配方是

  1. 子集c0-> 给组YN
  2. c0=="N"子集中通过c1--> 给组NANB
  3. 子集NANB 通过c2--> 给组NAi, NAj, NBi,NBj
  4. row_bind N?ito Y?iand N?jto Y?j(where ?is Aor B) --> 给出最后的 4 个数据子集

在 R 中:

subset.Yi <- d %>% filter(c0=="Y"& c2=="i")
subset.Yj <- d %>% filter(c0=="Y"& c2=="j")

list(
  d1 = d %>% filter(c0=="N" & c1 == "A", c2 == "i") %>% rbind(subset.Yi),
  d2 = d %>% filter(c0=="N" & c1 == "B", c2 == "i") %>% rbind(subset.Yi),
  d3 = d %>% filter(c0=="N" & c1 == "A", c2 == "j") %>% rbind(subset.Yj),
  d4 = d %>% filter(c0=="N" & c1 == "B", c2 == "j") %>% rbind(subset.Yj)
) %>% 
tibble::tibble(batches = paste0("batch",1:length(.)),data = .) ->tmp

如果匹配c2不重要,我可以执行以下操作:

d %>% filter(.,c0 == "N") %>% 
  group_by(.,c1) %>% 
    do(batches = rbind(d[d$c0=="Y"],.)) -> tmp

但这还不是。先感谢您!顺便说一句,我知道tidyverse这在外面是可行的,但是当我为我tidyverse的其余代码采用方案时,我希望保持一致。

4

1 回答 1

0

这是在这种情况下有效的解决方案(尽管很高兴从其他人那里看到其他可能更通用的方法)。

tmp <- d %>% 
  group_by(c2) %>% 
  nest(.key = c2) %>%
  mutate(c2 = map(c2,~ .x %>% 
                    filter(.,c0 == "N") %>% 
                    group_by (.,c1) %>% 
                    do(batches = bind_rows(
                      .x %>% filter(.,c0 == "Y") %>% select(-c1),
                      (.) %>%  select(-c1)  ))
                  ))

tmp这里将包含四个子集。然后我可以做类似的事情

tmp %>% unnest(c2) %>% .$batches %>% map(.,~sum(.$num)) %>% unlist

它给出了4 个子集中每个子集中的colSumof 列num

[1] -1.94302047  1.14452254 -0.08355576  1.62951506

旁注:c1在这里取消选择在技术上不是必需的,但由于我是 row_binding 使得数据框的一部分忽略了该值c1(请参阅上面的子集配方和注释?),c1 的值被混淆了,所以我删除了它。

于 2017-06-14T18:53:04.657 回答