Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何将两个字符列转换为二进制矩阵?_R - Fatal编程技术网

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))
如何?@Ben
x
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)