我有以下数据框:
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。
非常感谢
答案 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))