2013-02-12 5 views
1

У меня есть некоторые данные, которые выглядят так:частично совпадают с data.frame и подмножество всех data.frame

List_name  Condition1 Condition2 Situation1 Situation2 
    List1   0.01   0.12   66   123 
    List2   0.23   0.22   45   -34 
    List3   0.32   0.23   13   -12 
    List4   0.03   0.56   -3   45 
    List5   0.56   0.05   12   100 
    List6   0.90   0.09   22   32 

Я хотел бы, чтобы фильтровать каждый столбец «Состояние» данных. кадр в соответствии с отключением 0,5. После фильтра подмножество будет происходить и будет нести соответствующее значение столбцов «Ситуация». Фильтр и подмножество будут работать в паре: «Условие1» с «Ситуация1», «Условие2» с «Ситуация2» и т. Д.

Просто желаемый результат:

List_name  Condition1  Situation1 List_name Condition2 Situation2 
    List1   0.01    66  List1  0.12  123 
    List2   0.23    45  List2  0.22  -34 
    List3   0.32    13  List3  0.23  -12 
    List4   0.03    -3  List5  0.05  100 
              List6  0.09   32 

Я уверен, что есть, вероятно, еще одна подобная ситуация писал раньше, но я искал и не нашел его.

+0

Что делать, если если условие выполняется в Condition1 и не condition2 ... например песни4? Вы возьмете 4 строки для всех ситуаций? Я dnt'see столбец Ситуация2 .. это ошибка типа? – agstudy

+0

О, извините, я допустил ошибку! Я редактирую! – Fuv8

+0

Почему List4 в списке вывода? Условие2 составляет 0,56, что составляет> 0,5. – prabhasp

ответ

1

Вы можете использовать понятие, что логические проверки векторизованные:

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 
+0

HI Justin! Большое спасибо за вашу помощь! Тем не менее, после вставки обоих: out.c <- dcast (out, List_name ~ condition, value.var = 'cond.val') и out.s <- dcast (out, List_name ~ ситуация, значение .var = 'situ.val'): «Функция агрегирования отсутствует: значение по умолчанию». Что это значит? Reshape для меня совершенно новый. – Fuv8

+0

Это означает, что одна из этих двух команд имеет дублированные строки (комбинации 'List_name' и' condition'). – Justin

+0

Привет, Джастин! Он работает очень хорошо! Я думаю, что reshape2 - очень мощная библиотека! большое спасибо за вашу помощь! – Fuv8

2

Похоже на отличное решение @Arun, но на основе имен столбцов и без каких-либо предположений.

cols.conds <- colnames(dat)[gregexpr(pattern='Condition[0-9]+',colnames(dat)) > 0] 
lapply(cols.conds, function(x){ 
    col.list <- colnames(dat)[1] 
    col.situ <- gsub('Condition','Situation',x) 
    dat[which(dat[[x]] < 0.5), c(col.list,x,col.situ)]} 
) 

Я предполагаю, что Даты является:

dat <- read.table(text =' List_name  Condition1 Condition2 Situation1 Situation2 
    List1   0.01   0.12   66   123 
    List2   0.23   0.22   45   -34 
    List3   0.32   0.23   13   -12 
    List4   0.03   0.56   -3   45 
    List5   0.56   0.05   12   100 
    List6   0.90   0.02   22   32',head=T) 
+0

agstudy, извините .. окончательное редактирование поможет вам понять. Извините снова за несколько изменений. – Fuv8

+0

@ Fuv8 вы можете увидеть мое редактирование. – agstudy

+0

Hi agstudy! Большое вам спасибо за вашу помощь! – Fuv8

1

Я думаю, что вы просите достижима, но она не может быть bind (связанно) в том, как вы показали, как они имеют неравные элементы. Итак, вы получите список.

Здесь я полагаю, что ваш data.frame всегда имеет форму List_name, а затем список Condition1, ..., ConditionN, а затем Situation1, ..., SituationN.

Тогда это может быть получено путем получения ids первой и затем фильтруют с помощью lapply

ids <- grep("Condition", names(df)) 
lapply(ids, function(x) df[which(df[[x]] < 0.5), c(1,x,x+length(ids))]) 

# [[1]] 
# List_name Condition1 Situation1 
# 1  List1  0.01   66 
# 2  List2  0.23   45 
# 3  List3  0.32   13 
# 4  List4  0.03   -3 
# 
# [[2]] 
# List_name Condition2 Situation2 
# 1  List1  0.12  123 
# 2  List2  0.22  -34 
# 3  List3  0.23  -12 
# 5  List5  0.05  100 
# 6  List6  0.09   32 
Смежные вопросы