获得一个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'模式的列)。
答案 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