R 如何将两个字符列转换为二进制矩阵?
以下是一个例子:R 如何将两个字符列转换为二进制矩阵?,r,R,以下是一个例子: df <- data.frame(x=c("A", "A", "B", "C", "C", "C"), y=c("m", "n", "o", "p", "q", "r")) df x y 1 A m 2 A n 3 B o 4 C p 5 C q 6 C r 我的第一个想法是使用tidyr::spread(),但似乎无法正常工作。您可以使用: library(tidyverse) df %>% pivot_wider(y, n
df <- data.frame(x=c("A", "A", "B", "C", "C", "C"), y=c("m", "n", "o", "p", "q", "r"))
df
x y
1 A m
2 A n
3 B o
4 C p
5 C q
6 C r
我的第一个想法是使用tidyr::spread()
,但似乎无法正常工作。您可以使用:
library(tidyverse)
df %>%
pivot_wider(y,
names_from = x,
values_from = x,
values_fn = list(x = length),
values_fill = list(x = 0))
y A B C
<chr> <int> <int> <int>
1 m 1 0 0
2 n 1 0 0
3 o 0 1 0
4 p 0 0 1
5 q 0 0 1
6 r 0 0 1
库(tidyverse)
df%>%
枢轴(y,
名称_from=x,
值_from=x,
值\u fn=列表(x=长度),
值\u填充=列表(x=0))
y A B C
1米100
2n1010
3 00 1 0
4P001
5q001
6 r 0 1
这行吗
library(tidyverse)
df<-data.frame(x=c("A", "A", "B", "C", "C", "C"), y=c("m", "n", "o", "p", "q",
"r"))
df %>%
mutate(x=str_split(x, ",")) %>%
unnest() %>%
mutate(dummy=1) %>%
spread(x, dummy, fill=0)
一个基本的解决方案
cbind(df[-1], +sapply(unique(df$x), `==`, df$x))
# y A B C
# 1 m 1 0 0
# 2 n 1 0 0
# 3 o 0 1 0
# 4 p 0 0 1
# 5 q 0 0 1
# 6 r 0 0 1
我们可以在
base R
+(t(table(df)) > 0)
例如,一行是否可能有
am
,另一行是否可能有bm
?如果是这样,预期矩阵中的行m
是否为11 0
(假设原始矩阵中没有行cm
)?那么t(表(df))
如何?@Benx
和y
可能有重复的组合,因此table()
将创建大于1的数字。易于修复:result[result>0]=1
@Ben,但它会删除这些重复项的信息。当然,这取决于OP的目标。
cbind(df[-1], +sapply(unique(df$x), `==`, df$x))
# y A B C
# 1 m 1 0 0
# 2 n 1 0 0
# 3 o 0 1 0
# 4 p 0 0 1
# 5 q 0 0 1
# 6 r 0 0 1
+(t(table(df)) > 0)