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)