2014-01-22 105 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