2014-10-10 5 views
1

Я много раз искал переполнение стека, не найдя ответа на следующий вопрос: Я ищу функцию, которая позволяет мне проверить, содержат ли какие-то столбцы какие-либо из указанных строк.Тест для нескольких строк в нескольких столбцах

# 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)) 

Подводя итог. Я могу заставить его работать, если я проверяю только один столбец или смотрю только на одну из строк. Но мне нужно проверить, содержится ли какая-либо из строк в любом из указанных столбцов, и в этом случае вернуть значение даты в качестве новой переменной.

Любая помощь очень ценится.

+0

Что выход вы ищете? Массив номеров строк? Логическое? – Pop

+0

Учитывая, что я собираюсь создать новую переменную из этого условия, я думаю, что логический выход будет предпочтительнее. –

ответ

1

Ниже может помочь:

> 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" 

В данных a.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(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> 
3

Если вы просто хотите знать, если столбцы содержат буквы, которые можно применить к каждому колонке вашей data.frame в %in% функции:

apply(dat[,-5], 2, '%in%', x=stroke) 

Если вы хотите знать позицию каждой буквы 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]) 

или

sapply(stroke, function(y) apply(dat, 2, function(table,x) which(x==table), x=y), simplify=FALSE) 

Если вы хотите, чтобы знать положение всех букв инсульта, сделайте следующее:

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

Спасибо Pop. Я ищу выход, где добавляется дополнительная переменная, и эта переменная равна переменной DATE для этих строк с соответствующими строками. Я пробовал ваш код, но я думаю, что я сделал что-то не так; dat $ infarction = ifelse ((apply (dat [, - 5], 2, '% in%', x = ami)), dat $ DATE, NA) –

+0

Это решило мою следующую проблему, хотя ...Благодаря! –

2

Это зависит от того, что ваш требуемого выхода. @ Ответ на поп отлично, я просто хочу добавить, что ваш подход 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)) 

, а затем

result <- rep(NA, nrow(dat)) 
result[idx] <- dat$DATE[idx] 
Смежные вопросы