Вы можете использовать понятие, что логические проверки векторизованные:
x <- c(0.1, 0.3, 0.5, 0.2)
x < 0.5
# [1] TRUE TRUE FALSE TRUE
И некоторые grep
результатов:
grep('Condition', names(DF1))
Для сделать это подмножество нг вы можете использовать apply
, чтобы сгенерировать булева вектора:
keepers <- apply(DF1[, grep('Condition', names(DF1))], 1, function(x) any(x < 0.5))
И подмножество:
DF1[keepers,]
Обратите внимание, что это не обязательно возвращать структуру данных, которую вы проявили в вашем вопросе. Но вы можете изменить анонимную функцию, используя all
или другое пороговое значение.
Вместо редакций я подойду к этому по-другому. Я хотел бы использовать melt
из reshape2
пакета:
library(reshape2)
dat.c <- melt(DF1,
id.var='List_name',
measure.var=grep('Condition', names(DF1), value=TRUE),
variable.name='condition',
value.name='cond.val')
dat.c$idx <- gsub('Condition', '', dat.c$condition)
dat.s <- melt(DF1,
id.var='List_name',
measure.var=grep('Situation', names(DF1), value=TRUE),
variable.name='situation',
value.name='situ.val')
dat.s$idx <- gsub('Situation', '', dat.s$situation)
dat <- merge(dat.c, dat.s)
out <- dat[dat$cond.val < 0.5,]
List_name idx condition cond.val situation situ.val
1 List1 1 Condition1 0.01 Situation1 66
2 List1 2 Condition2 0.12 Situation2 123
3 List2 1 Condition1 0.23 Situation1 45
4 List2 2 Condition2 0.22 Situation2 -34
5 List3 1 Condition1 0.32 Situation1 13
6 List3 2 Condition2 0.23 Situation2 -12
7 List4 1 Condition1 0.03 Situation1 -3
10 List5 2 Condition2 0.05 Situation2 100
12 List6 2 Condition2 0.09 Situation2 32
Вы можете использовать dcast
поместить данные обратно в исходном формате, если вы хотите, но я нахожу данные в этой «длинной» форме гораздо проще работать. Эта форма также приятна, поскольку она позволяет избежать необходимости в значениях NA, где у вас есть строки, где выполняется одно условие, а другие нет.
out.c <- dcast(out, List_name ~ condition, value.var='cond.val')
out.s <- dcast(out, List_name ~ situation, value.var='situ.val')
merge(out.c, out.s)
List_name Condition1 Condition2 Situation1 Situation2
1 List1 0.01 0.12 66 123
2 List2 0.23 0.22 45 -34
3 List3 0.32 0.23 13 -12
4 List4 0.03 NA -3 NA
5 List5 NA 0.05 NA 100
6 List6 NA 0.09 NA 32
Что делать, если если условие выполняется в Condition1 и не condition2 ... например песни4? Вы возьмете 4 строки для всех ситуаций? Я dnt'see столбец Ситуация2 .. это ошибка типа? – agstudy
О, извините, я допустил ошибку! Я редактирую! – Fuv8
Почему List4 в списке вывода? Условие2 составляет 0,56, что составляет> 0,5. – prabhasp