2014-01-22 73 views
1

我已经得到了以下数据帧应用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名以“A1”中的一个启动因素Diag1-7列

1)我知道如何搜索完整的数据帧为一个特定的因子:

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

2)我知道如何一列内搜索一个图案:

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

a)我想在所有列Diag1-Diag7上使用grepl,方法与1)相同。 B)如果可能,我想创建一个名为“result”的新变量,如果行中有“A1”,则包含1,如果行中没有“A1”,则包含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

你需要一个正则表达式。 "^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 
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)) 
+0

美丽的解决方案,谢谢! – Roccer