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
得到一个 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