R 无硬编码的双扩展
我被困在这里了。我从R 无硬编码的双扩展,r,R,我被困在这里了。我从tidyr开始尝试使用spread两次,我尝试加入。但是,如果没有一些硬编码,这些方法都不能给出正确的解决方案 有没有办法转换这些数据: cat1 cat2 title 1 A G AB 2 B G BC 3 C B CD 4 D G DE 5 E H EF 6 F A FG 为此: A B C D E
tidyr
开始尝试使用spread
两次,我尝试加入。但是,如果没有一些硬编码,这些方法都不能给出正确的解决方案
有没有办法转换这些数据:
cat1 cat2 title
1 A G AB
2 B G BC
3 C B CD
4 D G DE
5 E H EF
6 F A FG
为此:
A B C D E F G H
AB 1 0 0 0 0 0 1 0
BC 0 1 0 0 0 0 1 0
CD 0 1 1 0 0 0 0 0
DE 0 0 0 1 0 0 1 0
EF 0 0 0 0 1 0 0 1
FG 1 0 0 0 0 1 0 0
样本数据:
df<-data.frame(cat1=LETTERS[1:6],
cat2=c('G','G','B','G','H','A'),
title=paste0(LETTERS[1:6],LETTERS[2:7]))
df先熔化,然后浇铸:
require(reshape2)
melt(df, id="title") %>% dcast(title ~ value, length)
title A B C D E F G H
1 AB 1 0 0 0 0 0 1 0
2 BC 0 1 0 0 0 0 1 0
3 CD 0 1 1 0 0 0 0 0
4 DE 0 0 0 1 0 0 1 0
5 EF 0 0 0 0 1 0 0 1
6 FG 1 0 0 0 0 1 0 0
melt
将所有值放在一列中进行转换。只需先melt
,然后进行转换:
require(reshape2)
melt(df, id="title") %>% dcast(title ~ value, length)
title A B C D E F G H
1 AB 1 0 0 0 0 0 1 0
2 BC 0 1 0 0 0 0 1 0
3 CD 0 1 1 0 0 0 0 0
4 DE 0 0 0 1 0 0 1 0
5 EF 0 0 0 0 1 0 0 1
6 FG 1 0 0 0 0 1 0 0
melt
将所有值放在一列中进行转换。我不知道这是否符合op的硬编码条件
df %>%
tidyr::gather(key = vars, value = values, cat1, cat2) %>%
dplyr::mutate(vars = 1) %>%
tidyr::spread(key = values, value = vars, fill = 0)
# title A B C D E F G H
# 1 AB 1 0 0 0 0 0 1 0
# 2 BC 0 1 0 0 0 0 1 0
# 3 CD 0 1 1 0 0 0 0 0
# 4 DE 0 0 0 1 0 0 1 0
# 5 EF 0 0 0 0 1 0 0 1
# 6 FG 1 0 0 0 0 1 0 0
我不知道这是否符合op的硬编码条件
df %>%
tidyr::gather(key = vars, value = values, cat1, cat2) %>%
dplyr::mutate(vars = 1) %>%
tidyr::spread(key = values, value = vars, fill = 0)
# title A B C D E F G H
# 1 AB 1 0 0 0 0 0 1 0
# 2 BC 0 1 0 0 0 0 1 0
# 3 CD 0 1 1 0 0 0 0 0
# 4 DE 0 0 0 1 0 0 1 0
# 5 EF 0 0 0 0 1 0 0 1
# 6 FG 1 0 0 0 0 1 0 0
将两列堆叠起来,将标题列与其自身堆叠起来,然后展开?将两列堆叠起来,将标题列与其自身堆叠起来,然后展开?因此,对于硬编码,我的意思是您必须在一个点上选择A
或H
或AB
或FG
。因此,您在硬编码方面处于绿色,我的意思是您必须在某一点上选择A
或H
或AB
或FG
。所以你是绿色的你的答案是两个答案中跑得最快的你的答案是两个答案中跑得最快的