R扩展具有特定模式的列

时间:2018-03-08 09:01:37

标签: r dplyr spread

获得一个data.frame,其中包含如下列:

Column_1
AAA
B
BBB
AAA_FACE
CCC
BBB_AAA

我想将列扩展到新列(但不是所有我的唯一值,因为那时我会得到非常非常多的列),但仅适用于包含特定模式的值:" AAA&#34 ;

在传播值之后,我想让它们成为二进制,所以理想情况下我的新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'模式的列)。

2 个答案:

答案 0 :(得分:1)

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"))

答案 1 :(得分:1)

使用基本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