根据通过在多列上应用grepl找到的因子创建变量

时间:2014-01-22 10:05:54

标签: r apply grepl

我有以下数据框:

set.seed(1)
Data <- data.frame(id = seq(1, 10), age = seq(45,54),
Diag1 = sample(c("A123", "B123", "C123"), 10, replace = TRUE), 
Diag2 = sample(c("D123", "", "A155"), 10, replace = TRUE), 
Diag3 = sample(c("G123", "H123", "I123"), 10, replace = TRUE), 
Diag4 = sample(c("A123", "B123", "C123"), 10, replace = TRUE), 
Diag5 = sample(c("J123", "K123", ""), 10, replace = TRUE), 
Diag6 = sample(c("", "N123", "O123"), 10, replace = TRUE), 
Diag7 = sample(c("P123", "Q123", "R123"), 10, replace = TRUE))

我正在寻找所有ID的一个因子,其中一个以Diag1-7列中的“A1”开头

1)我知道如何在完整的数据框中搜索一个特定的因素:

y <- Data[apply(Data,1,function(x) {"A123" %in% x}),]

2)我知道如何在一列中搜索模式:

x <- Data[grepl("A1", Data$Diag1),]

A)我想在所有列Diag1-Diag7上以与1)相同的方式使用grepl。

B)如果可能,我想创建一个名为“result”的新变量,如果行中有“A1”,则包含1;如果行中没有“A1”,则包含0。

非常感谢

3 个答案:

答案 0 :(得分:4)

答:您可以轻松地在列上使用grepl:

# select all columns except first two
y2 <- Data[apply(Data[-c(1,2),],2,function(x) {"A123" %in% x}),]

B:

Data$result <- as.numeric(apply(Data,1,function(x) {any(grepl("A1", x))}))

这就是你想要的吗?

修改:如果"A1"需要在开头,请按照以下建议使用any(grepl("^A1.*", x))

答案 1 :(得分:1)

你需要一个正则表达式。 "^A1.*"表示:如果字符串A1的开头有^,后跟任意数量的其他字符.*

i <- apply(Data[3:9], 1, function(x) any(grepl("^A1.*", x)))
Data[i, ]

   id age Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7
1   1  45  A123  D123  I123  B123        N123  R123
3   3  47  B123  A155  H123  B123        N123  Q123
4   4  48  C123        G123  A123  K123        P123
5   5  49  A123  A155  G123  C123  K123        Q123
7   7  51  C123  A155  G123  C123  J123        Q123
8   8  52  B123  A155  H123  A123  K123  N123  R123
10 10  54  A123  A155  H123  B123        N123  R123

答案 2 :(得分:1)

这个怎么样?

Data$count<-apply(Data,1,function(x)sum(grepl("^A1", x)))
Data
#   id age Diag1 Diag2 Diag3 Diag4 Diag5 Diag6 Diag7 count
#1   1  45  A123  D123  I123  B123        N123  R123     1
#2   2  46  B123  D123  G123  B123  K123  O123  P123     0
#3   3  47  B123  A155  H123  B123        N123  Q123     1
#4   4  48  C123        G123  A123  K123        P123     1
#5   5  49  A123  A155  G123  C123  K123        Q123     2
#6   6  50  C123        H123  C123              P123     0
#7   7  51  C123  A155  G123  C123  J123        Q123     1
#8   8  52  B123  A155  H123  A123  K123  N123  R123     2
#9   9  53  B123        I123  C123        N123  P123     0
#10 10  54  A123  A155  H123  B123        N123  R123     2
抱歉:如果你只想要一个1/0而不是一个计数:

Data$match<-apply(Data,1,function(x)as.integer(sum(grepl("^A1", x))>=1))