1

我有以下数据框:

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

我在 Diag1-7 列之一中寻找以“A1”开头的所有 id

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

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

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

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

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

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

非常感谢

4

3 回答 3

4

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

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

乙:

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

那是你想要的吗?

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

于 2014-01-22T10:22:01.037 回答
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))
于 2014-01-22T10:20:58.517 回答
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
于 2014-01-22T10:16:03.807 回答