R 测试多列中的多个字符串

R 测试多列中的多个字符串,r,R,我对堆栈溢出进行了大量搜索,但没有找到以下问题的答案: 我正在寻找一个函数,它可以让我测试某些列是否包含任何指定的字符串 # I'm looking for heart attacks infarction <- c("b", "c") # I'm also looking for strokes stroke <- c("h", "i") #sample data set set.seed(1234) dat <- data.frame(A = sample(letters

我对堆栈溢出进行了大量搜索,但没有找到以下问题的答案: 我正在寻找一个函数,它可以让我测试某些列是否包含任何指定的字符串

# I'm looking for heart attacks
infarction <- c("b", "c")
# I'm also looking for strokes
stroke <- c("h", "i")

#sample data set
set.seed(1234)
dat <- data.frame(A = sample(letters[1:9],10,TRUE),
                  B = sample(letters[1:9],10,TRUE),
                  C = sample(letters[1:9],10,TRUE),
                  D = sample(letters[1:9],10,TRUE),
                  DATE = sample.int(10, size = 10, replace = FALSE))

# I've tried many things. Among them:
# first one using the dplyr package.

infarction = ifelse( (infarction  %in% dat[,c("A", "B", "C", "D")]), DATE, NA))

#excluded a few rows from the mutate...

#I've also tried
grep(paste(infarction,collapse="|"), dat[,1:4], value=TRUE), DATE, NA))
#我在寻找心脏病发作

如果您只想知道列中是否包含字母,可以将
函数应用于
data.frame的每一列

apply(dat[,-5], 2, '%in%', x=stroke)
如果您想知道
笔划的每个字母在列中的位置,可以使用
which
功能将其应用于每列:

apply(dat[,-5], 2, function(table,x) which(x==table), x=stroke[1])
apply(dat[,-5], 2, function(table,x) which(x==table), x=stroke[2])

如果要知道所有笔划字母的位置,请执行以下操作:

apply(dat[,-5], 2, function(x) unlist(sapply(stroke , function(i) which( i == x))))

如果您只想知道列中是否包含字母,可以将%
函数中的
%应用于
data.frame
的每一列:

apply(dat[,-5], 2, '%in%', x=stroke)
如果您想知道
笔划的每个字母在列中的位置,可以使用
which
功能将其应用于每列:

apply(dat[,-5], 2, function(table,x) which(x==table), x=stroke[1])
apply(dat[,-5], 2, function(table,x) which(x==table), x=stroke[2])

如果要知道所有笔划字母的位置,请执行以下操作:

apply(dat[,-5], 2, function(x) unlist(sapply(stroke , function(i) which( i == x))))

这取决于你想要的输出是什么@Pop的回答非常好,我只想补充一点,就是你的
grep
方法是正确的,除非你不能在
x
参数中给它一个数据帧。您必须按列执行它。这是因为
grep
x
参数强制为一个字符,您可以查看是否键入
as.character(dat[,1:4])
表示您是
grep
输入了错误的字符串。相反,试着举个例子

grepres <- lapply(dat[1:4], grep, pattern = paste(infarction,collapse="|"))
idx <- setdiff(1:nrow(dat), unlist(grepres))

grepres这取决于您想要的输出是什么@Pop的回答非常好,我只想补充一点,就是你的
grep
方法是正确的,除非你不能在
x
参数中给它一个数据帧。您必须按列执行它。这是因为
grep
x
参数强制为一个字符,您可以查看是否键入
as.character(dat[,1:4])
表示您是
grep
输入了错误的字符串。相反,试着举个例子

grepres <- lapply(dat[1:4], grep, pattern = paste(infarction,collapse="|"))
idx <- setdiff(1:nrow(dat), unlist(grepres))
grepres以下内容可能会有所帮助:

> apply(dat, 1, function(x) ifelse(infarction %in% x[1:5],x[5],NA  ))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] " 6" NA   " 3" NA   " 2" NA   " 7" NA   " 1" NA   
[2,] " 6" "10" " 3" NA   " 2" NA   " 7" " 9" NA   " 4" 
在data.frame格式中:

> as.data.frame(t(apply(dat, 1, function(x) ifelse(infarction %in% x[1:5],x[5],NA  ))))

     V1   V2
1     6    6
2  <NA>   10
3     3    3
4  <NA> <NA>
5     2    2
6  <NA> <NA>
7     7    7
8  <NA>    9
9     1 <NA>
10 <NA>    4
>as.data.frame(t(应用(dat,1,函数(x)ifelse(在%x[1:5],x[5],NA]中的百分比)))
V1 V2
1     6    6
2     10
3     3    3
4.
5     2    2
6.
7     7    7
8      9
9     1 
10     4
对于中风:

> as.data.frame(t(apply(dat, 1, function(x) ifelse(stroke %in% x[1:5],x[5],NA  ))))

     V1   V2
1  <NA> <NA>
2  <NA> <NA>
3  <NA> <NA>
4  <NA>    5
5     2 <NA>
6     8 <NA>
7  <NA> <NA>
8  <NA>    9
9     1    1
10    4 <NA>
>作为.data.frame(t(应用(dat,1,函数(x)ifelse(笔划%x[1:5],x[5],NA)))
V1 V2
1.
2.
3.
4      5
5     2 
6     8 
7.
8      9
9     1    1
10    4 
以下内容可能会有所帮助:

> apply(dat, 1, function(x) ifelse(infarction %in% x[1:5],x[5],NA  ))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] " 6" NA   " 3" NA   " 2" NA   " 7" NA   " 1" NA   
[2,] " 6" "10" " 3" NA   " 2" NA   " 7" " 9" NA   " 4" 
在data.frame格式中:

> as.data.frame(t(apply(dat, 1, function(x) ifelse(infarction %in% x[1:5],x[5],NA  ))))

     V1   V2
1     6    6
2  <NA>   10
3     3    3
4  <NA> <NA>
5     2    2
6  <NA> <NA>
7     7    7
8  <NA>    9
9     1 <NA>
10 <NA>    4
>as.data.frame(t(应用(dat,1,函数(x)ifelse(在%x[1:5],x[5],NA]中的百分比)))
V1 V2
1     6    6
2     10
3     3    3
4.
5     2    2
6.
7     7    7
8      9
9     1 
10     4
对于中风:

> as.data.frame(t(apply(dat, 1, function(x) ifelse(stroke %in% x[1:5],x[5],NA  ))))

     V1   V2
1  <NA> <NA>
2  <NA> <NA>
3  <NA> <NA>
4  <NA>    5
5     2 <NA>
6     8 <NA>
7  <NA> <NA>
8  <NA>    9
9     1    1
10    4 <NA>
>作为.data.frame(t(应用(dat,1,函数(x)ifelse(笔划%x[1:5],x[5],NA)))
V1 V2
1.
2.
3.
4      5
5     2 
6     8 
7.
8      9
9     1    1
10    4 

您想要的输出是什么?行数数组?一个布尔值?鉴于我的目标是根据这个条件创建一个新变量,我认为最好是逻辑输出。您想要的输出是什么?行数数组?一个布尔值?鉴于我的目标是根据这个条件创建一个新变量,我认为最好是逻辑输出。谢谢。我正在寻找一个输出,其中添加了一个额外的变量,该变量等于具有匹配字符串的行的日期变量。我尝试了你的代码,但我认为我做错了什么;dat$in梗=ifelse((应用(dat[,-5],2,,%in%',x=ami)),dat$DATE,NA)感谢Pop。我正在寻找一个输出,其中添加了一个额外的变量,该变量等于具有匹配字符串的行的日期变量。我尝试了你的代码,但我认为我做错了什么;dat$in梗=ifelse((应用(dat[,-5],2,,%in%',x=ami)),dat$DATE,NA)