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'sspread() 函数。但是我遇到了一个问题,即我将数据分布在很多很多列中(而不仅仅是包含“AAA”模式的列)。

4

2 回答 2

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"))
于 2018-03-08T09:06:43.413 回答
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
于 2018-03-08T09:17:53.277 回答