2012-12-15 2 views
2

У меня много переменных, имеющих много наблюдений. У меня есть одна стандартная переменная. Теперь я хочу рассчитать разницу между стандартными и наблюдаемыми переменными только тогда, когда наблюдение больше стандартного и суммирует все различия как отдельные переменные. Кроме того, имена переменных, которые больше, чем стандарт в отдельном столбце.Расчет разницы и суммирование в отдельной колонке

Names Standard Das Dss Tri Tet 
Aa 32 42 21 45 34 
Ab 23 25 43 43 32 
Ac 43 34 23 32 23 
Ad 23 24 33 12 23 
Ae 14 24 12 20 24 
Af 43 42 13 12 43 
Ag 12 13 22 13 22 
Ah 32 32 42 42 23 

ВЫВОД:

Names Standard Das Dss Tri Tet Difference No_Difference Names_Difference 
Aa 32 42 21 45 34 15 3 Das, Tri, Tet 
Ab 23 25 43 43 32 52 4 Das,Dss,Tri,Tet 
Ac 43 34 23 32 23 0 0 NA 
Ad 23 24 33 12 23 10 2 Das,Dss 
Ae 14 24 12 20 24 26 4 Das,Tri,Tet 
Af 43 42 13 12 43 0 0 NA 
Ag 12 13 22 13 22 22 4 Das,Dss,Tri,Tet 
Ah 32 32 42 42 23 20 2 Dss,Tri 
+0

Ваш выход будет неполным, не является? Не ясно, суммируете ли вы только положительную разницу? – agstudy

+0

@agstudy, Да, это что-то вроде этого, по-разному, Observation-Standard = + ve, чем суммировать все значения + ve. Надеюсь, теперь все ясно. Кроме того, имена столбцов, которые имеют большее наблюдение, чем соответствующие стандартные значения. Итак, я мог видеть, на каком участке наблюдение положительное. Спасибо за помощь – Gongon

ответ

3

Допустим, ваши данные выше, хранится в объекте df. Тогда это должно работать

df2 <- do.call(rbind, apply(df[, -1], 1, function(z) { 
     ind <- z[2:5] > z[1] 
     return(cbind.data.frame(
         Difference = sum(z[2:5][ind] - z[1]), 
         No_Difference = sum(ind), 
         Names_Difference = paste(colnames(df[3:6])[ind], 
           collapse = ", ") 
       )) 
    })) 

df <- cbind(df, df2) 
df 

    Names Standard Das Dss Tri Tet Difference No_Difference Names_Difference 
1 Aa  32 42 21 45 34   25    3  Das, Tri, Tet 
2 Ab  23 25 43 43 32   51    4 Das, Dss, Tri, Tet 
3 Ac  43 34 23 32 23   0    0     
4 Ad  23 24 33 12 23   11    2   Das, Dss 
5 Ae  14 24 12 20 24   26    3  Das, Tri, Tet 
6 Af  43 42 13 12 43   0    0     
7 Ag  12 13 22 13 22   22    4 Das, Dss, Tri, Tet 
8 Ah  32 32 42 42 23   20    2   Dss, Tri 

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

+0

@ adibender спасибо за ваш ответ, но это не дает мне правильный результат. Вероятно, мой вопрос не был правильным. Мне нужно рассчитать разницу по ряду. Для каждого значения стандартного столбца сравнивайте с наблюдаемыми столбцами (например, Das, Dss, Tri, Tet), и если наблюдаемое значение больше, вычислите разницу и суммируйте все различия каждой строки отдельно и создайте новый столбец с названием «Разница» и кроме того, имена этих столбцов также. Спасибо – Gongon

+0

@maria raz: можете ли вы привести пример для одной строки, чтобы вычислить разницу, например, первую? – adibender

+0

Я думал, что это будет '(42 - 32) + (45 - 32) + (34 - 32)' для первой строки – adibender

2

Чтобы добавить только те значения, где это стандартный val меньше, чем obs, вот простой способ. Мой пример для одной строки, поэтому я буду использовать вектор.

> foo<- sample(10,10,replace=TRUE) 
> foo 
[1] 7 5 10 8 8 7 4 1 8 2 
> sum((foo[-1]-foo[1])*(foo[-1]>foo[1])) 
[1] 6 

Кто-то может сделать имя сбора :-)

Смежные вопросы