完成并填写 data.frame 多个条件

Complete and fill data.frame with multiple conditions

我想用两个变量的所有组合完成一个 data.frame,但有两个条件。 这是我的 data.frame:

Data <- 
  data.frame(
    A = rep(c("a", "b", "c", "d"), each = 2),
    N = 1,
    Type = c("i", "i", "I", "i", "i", "i", "I", "I")
  )
> Data
  A N Type
1 a 1    i
2 a 1    i
3 b 1    I
4 b 1    i
5 c 1    i
6 c 1    i
7 d 1    I
8 d 1    I

现在我想用 AType 的所有组合来完成 data.frame,但前提是 A != "a"Type == "I"。所以只需要多一行,即 A == "c"Type == "I" 的行。此外,N 应该用 0 填充,请参阅下面我想要的输出。有没有一种优雅的方法来实现这一目标?如果有 tidyrcomplete 会很棒,但如果没有也没关系。要是像这里的顺序就更好了

> Data
  A N Type
1 a 1    i
2 a 1    i
3 b 1    I
4 b 1    i
5 c 1    i
6 c 1    i
7 c 0    I
8 d 1    I
9 d 1    I

也许,你可以试试这个-

library(dplyr)
library(tidyr)

Data %>%
  mutate(Type = factor(Type)) %>%
  filter(!A %in% A[Type == "I"], A != 'a') %>%
  complete(A, Type, fill = list(N = 0)) %>%
  bind_rows(Data %>% filter(A %in% A[Type == "I"] | A == 'a')) %>%
  arrange(A, -N)

#  A     Type      N
#  <chr> <chr> <dbl>
#1 a     i         1
#2 a     i         1
#3 b     I         1
#4 b     i         1
#5 c     i         1
#6 c     i         1
#7 c     I         0
#8 d     I         1
#9 d     I         1

筛选您感兴趣的组合 (filter(!A %in% A[Type == "I"], A != 'a')),complete 那些 A 值,将它们绑定到剩余的行和 arrange.

你可以这样做

library(tidyverse)

Data <- 
  data.frame(
    A = rep(c("a", "b", "c", "d"), each = 2),
    N = 1,
    Type = c("i", "i", "I", "i", "i", "i", "I", "I")
  )

Data %>%
  bind_rows(
    complete(Data, A, nesting(Type)) %>%
      filter(A != "a" & Type == "I" & is.na(N))  
  ) %>%
  mutate(N = replace_na(N, 0)) %>%
  arrange(A, -N)

我过滤 is.na(N) 以确保只添加“新”行。