完成并填写 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
现在我想用 A
和 Type
的所有组合来完成 data.frame
,但前提是 A != "a"
和 Type == "I"
。所以只需要多一行,即 A == "c"
和 Type == "I"
的行。此外,N
应该用 0
填充,请参阅下面我想要的输出。有没有一种优雅的方法来实现这一目标?如果有 tidyr
的 complete
会很棒,但如果没有也没关系。要是像这里的顺序就更好了
> 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)
以确保只添加“新”行。
我想用两个变量的所有组合完成一个 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
现在我想用 A
和 Type
的所有组合来完成 data.frame
,但前提是 A != "a"
和 Type == "I"
。所以只需要多一行,即 A == "c"
和 Type == "I"
的行。此外,N
应该用 0
填充,请参阅下面我想要的输出。有没有一种优雅的方法来实现这一目标?如果有 tidyr
的 complete
会很棒,但如果没有也没关系。要是像这里的顺序就更好了
> 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)
以确保只添加“新”行。