R展开具有特定模式的列

R spread columns with a specific pattern

得到一个 data.frame 的列如下:

Column_1
AAA
B
BBB
AAA_FACE
CCC
BBB_AAA

我想将该列扩展到新列中(但不是针对我所有的唯一值,因为那样我会得到非常非常多的列),但仅针对包含特定模式的值:"AAA" .

传播值后,我想让它们成为二进制,所以理想情况下我的新 data.frame 看起来像这样:

AAA    AAA_FACE     BBB_AAA 
 1        0           0 
 0        0           0 
 0        0           0 
 0        1           0 
 0        0           0 
 0        0           1 

我尝试了 dplyr's spread() 函数。但是我遇到了一个问题,我将数据分布在很多很多列中(而不是仅包含 'AAA' 模式的列)。

tidyverse 的一个选项是

library(tidyverse)
df1 %>% 
  mutate(i1 = as.integer(str_detect(Column_1, "AAA")), 
         rn = row_number()) %>%
  spread(Column_1, i1, fill = 0) %>% 
  select(matches("AAA"))
#   AAA AAA_FACE BBB_AAA
#1   1        0       0
#2   0        0       0
#3   0        0       0
#4   0        1       0
#5   0        0       0
#6   0        0       1

可以通过 replace 将其他值设为 NA 然后执行 spread

来提高效率
df1 %>%
  mutate(i1 = as.integer(str_detect(Column_1, "AAA")),
         Column_1 = replace(Column_1, !i1, NA), 
         rn = row_number()) %>% 
  spread(Column_1, i1, fill = 0) %>% 
  select(matches("AAA"))

使用基本的 R 代码:

您的数据

db<-data.frame(Column_1=c("AAA","B","BBB","AAA_FACE","CCC","BBB_AAA"))

识别"AAA"模式

AAA_names<-as.character(db[grep("AAA",db$Column_1),"Column_1"])

输出数据帧创建:

out<-data.frame(lapply(AAA_names, f<-function(x,y){ return(x == y) }, y=as.character(db$Column_1)))
colnames(out)<-AAA_names
out[,AAA_names] <- lapply(out[,AAA_names], as.numeric)

你的输出

out
  AAA AAA_FACE BBB_AAA
1   1        0       0
2   0        0       0
3   0        0       0
4   0        1       0
5   0        0       0
6   0        0       1