2015-04-09 2 views
0

у меня есть кадр данных в 18528 строк и 3 столбцов, как показано ниже:попарно Вычитание в dataf Раме с группами различной длины

Sample Target Value 
100  A  21.5 
100  A  20.5 
100  B  19.5 
100  B  19.75 
100  B  18.15 
100  B  21.95 
200  A  21.1 
200  A  21.6 
200  B  23.5 
200  B  20.75 
100  C  21.25 
100  C  22.0 
100  C  18.33 
100  C  21.84 

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

Sample Target Value dif 
100  A  21.5 1 
100  A  20.5 1 
100  B  19.5 0.25 
100  B  19.75 1.6 
100  B  18.15 3.8 
100  B  21.95 2.45 
200  A  21.1 0.5 
200  A  21.6 0.5 
200  B  23.5 2.75 
200  B  20.75 2.75 
100  C  21.25 0.75 
100  C  22.0 3.67 
100  C  18.33 3.51 
100  C  21.84 0.59 

Тогда, если разница составляет более 2, сделать это значение "NA", как:

Sample Target Value dif 
100  A  21.5 1 
100  A  20.5 1 
100  B  19.5 0.25 
100  B  19.75 1.6 
100  B  18.15 3.8 
100  B  NA  2.45 
200  A  21.1 0.5 
200  A  21.6 0.5 
200  B  NA  2.75 
200  B  NA  2.75 
100  C  21.25 0.75 
100  C  22.0 3.67 
100  C  NA  3.51 
100  C  21.84 0.59 

Я combn к рассчиты ваются поздняя разница, но я получил ошибку, я думаю, что причина может быть разной длины в группах (2 и 4). Заранее спасибо

+0

группа является пара (Sample, Target) я думаю? Фактически на выходе вы представляете, что вы снимаете линию 3 Значение в строку 2 Значение, чтобы получить разницу в строке 2 ... –

+0

точно, и спасибо за редактирование :) – Lili

+0

да, но мое замечание заключалось в том, что существует большая разница между тем, что вы сказал о gorup и том, что вы представили в качестве вывода (без группировки там, поскольку вы берете разницу между последовательными значениями). Так что я удивляюсь, что вы в конечном итоге хотите получить в результате ... –

ответ

0

Вы можете получить желаемый результат с помощью пакета dplyr. Если у вас нет установленной команды первого запуска install.packages("dplyr") или установите ее вручную.

Тогда что мы имеем:

require("dplyr") 

mydf <- read.table(text = " 
Sample Target Value 
100  A  21.5 
100  A  20.5 
100  B  19.5 
100  B  19.75 
100  B  18.15 
100  B  21.95 
200  A  21.1 
200  A  21.6 
200  B  23.5 
200  B  20.75 
100  C  21.25 
100  C  22.0 
100  C  18.33 
100  C  21.84", header = T) 

mydf1 <- mydf %>% group_by(Sample, Target) %>% 
    mutate(ValueShifted = c(Value[-1], Value[1])) %>% 
    mutate(dif = abs(Value - ValueShifted)) %>% 
    mutate(NewValue = c(1, NA)[(as.numeric(dif > 2)+1)] * Value) 

> mydf1 
Source: local data frame [14 x 6] 
Groups: Sample, Target 

    Sample Target Value ValueShifted dif NewValue 
1  100  A 21.50  20.50 1.00 21.50 
2  100  A 20.50  21.50 1.00 20.50 
3  100  B 19.50  19.75 0.25 19.50 
4  100  B 19.75  18.15 1.60 19.75 
5  100  B 18.15  21.95 3.80  NA 
6  100  B 21.95  19.50 2.45  NA 
7  200  A 21.10  21.60 0.50 21.10 
8  200  A 21.60  21.10 0.50 21.60 
9  200  B 23.50  20.75 2.75  NA 
10 200  B 20.75  23.50 2.75  NA 
11 100  C 21.25  22.00 0.75 21.25 
12 100  C 22.00  18.33 3.67  NA 
13 100  C 18.33  21.84 3.51  NA 
14 100  C 21.84  21.25 0.59 21.84 
+0

Спасибо, это работает как-то, но в последней группе 18.33 должно быть «NA», если это сделано, другие различия в этой группе будут меньше 2, и она будет одинаковой во второй группе (21.95). – Lili

+0

ОК, я не понял правила вычисления 'dif' полностью. Как бы это выглядело для 'x = c (1.1, 1.5, 2.5, 3)'? Я предположил, что просто разницу 'x [i] - x [i + 1]' для 'i' -ной строки с зацикливанием до первого значения в конце. Но, может быть, я ошибаюсь в вычислении 'diff', так что поправьте меня. Другой вопрос (ы): вам нужно удалить минимальный набор значений, чтобы сделать все 'dif's <2? Это то же условие, что и '(max (Value) - min (Value)) <2' внутри группы? А что, если значения в группе «15 15,5 19,5 20'? Итак, можете ли вы указать больше о том, что вам нужно делать с данными и каковы правила. – inscaven

+0

Благодарим вас за ваше рассмотрение, можно сказать, значение должно быть удалено с разницей более 2, в 15 15,5 19,5 20; 15 и 15.5 должны быть удалены, потому что 19.5-15.5 = 4> 2 и 20-15 = 5> 2 после удаления этих значений у нас будет 19.5 и 20, что разница меньше 2. Надеюсь, что я мог бы объяснить ясно. – Lili