2016-03-24 4 views
0

Я хочу преобразовать набор данных на основе определенных условий. Эти условия приведены в другом наборе данных. Позвольте мне объяснить это с помощью примера.Преобразование данных на основе определенных критериев трансформации

Пусть Я набор данные в следующем формате:

Date  Var1 Var2 
3/1/2016 8 14 
3/2/2016 7 8 
3/3/2016 7 6 
3/4/2016 10 8 
3/5/2016 5 10 
3/6/2016 9 15 
3/7/2016 2 5 
3/8/2016 6 14 
3/9/2016 8 15 
3/10/2016 8 8 

И следующий набор данные имеют условие трансформации и в следующем формате:

Variable Trans1 Trans2 
    Var1  1||2 0.5||0.7 
    Var2  1||2 0.3||0.8 

Теперь я хочу, чтобы извлечь первые условия из таблицы преобразования для Var1, 1.0.5 и добавьте 1 к Var1 и умножьте его на 0,5. Я сделаю то же самое для var2, добавлю на 1 и умножьте на 0,3. Это преобразование даст мне новую переменную Var1_1 и var2_1. Я сделаю то же самое для другой трансформации, которая даст мне Var1_2 и Var2_2. Для Var1_2 преобразование является суммой Var1 с 2 и умножается на 0,7.

После преобразования, набор данных будет выглядеть следующим образом:

Date  Var1 Var2 Var1_1 Var2_1 Var1_2 Var2_2 
3/1/2016 8 14  4.5  4.5  7  11.2 
3/2/2016 7 8  4  2.7  6.3  7 
3/3/2016 7 6  4  2.1  6.3  5.6 
3/4/2016 10 8  5.5  2.7  8.4  7 
3/5/2016 5 10  3  3.3  4.9  8.4 
3/6/2016 9 15  5  4.8  7.7 11.9 
3/7/2016 2 5  1.5  1.8  2.8  4.9 
3/8/2016 6 14  3.5  4.5  5.6 11.2 
3/9/2016 8 15  4.5  4.8  7  11.9 
3/10/2016 8 8  4.5  2.7  7  7 
+0

Вы действительно должны поделиться 'dput' из набора данных„условий“, по крайней мере. – Sotos

+0

@Sotos: Спасибо за ваш комментарий. Но я не понял, что вы подразумеваете, поставив условия. – Beta

+0

@beetroot: Спасибо за ваш комментарий. Я ошибся в расчетах. Я исправился. Благодаря! – Beta

ответ

2

Учитывая, что оригинал data.frame называется df и ваши условия таблицы cond1 тогда мы можем создать пользовательскую функцию,

funV1Cond1 <- function(x){ 
    t1 <- as.numeric(gsub("[||].*", "", cond1$Trans1[cond1$Variable == "Var1"])) 
    t2 <- as.numeric(gsub("[||].*", "", cond1$Trans2[cond1$Variable == "Var1"])) 
    result <- (x$Var1 + t1)*t2 
    return(result) 
} 
funV1Cond1(df) 
#[1] 4.5 4.0 4.0 5.5 3.0 5.0 1.5 3.5 4.5 4.5 

Точно так же с функцией 2

funV1Cond2 <- function(x){ 
    t1 <- as.numeric(gsub(".*[||]", "", cond1$Trans1[cond1$Variable == "Var1"])) 
    t2 <- as.numeric(gsub(".*[||]", "", cond1$Trans2[cond1$Variable == "Var1"])) 
    result <- (x$Var1 + t1)*t2 
    return(result) 
} 
funV1Cond2(df) 
#[1] 7.0 6.3 6.3 8.4 4.9 7.7 2.8 5.6 7.0 7.0 

Предполагая, что Trans1 колонка имеет 3 условия, т.е. 1, 2, 3 то,

as.numeric(sapply(str_split(cond1$Trans1[cond1$Variable == "Var1"], ','),function(x) x[2])) 
#[1] 2 
as.numeric(sapply(str_split(cond1$Trans1[cond1$Variable == "Var1"], ','),function(x) x[1])) 
#[1] 1 
as.numeric(sapply(str_split(cond1$Trans1[cond1$Variable == "Var1"], ','),function(x) x[3])) 
#[1] 3 

Обратите внимание, что я изменил разделители к «»

+0

Большое спасибо за ваш ответ. Я также могу очень быстро его обобщить. Но единственная проблема, которую я испытываю, - это «gsub». Предположим, что у меня несколько условий, каждая из которых разделена разделителем (как в моем случае с помощью «||»), могу ли я все еще использовать ваш пример. Как только я смогу проверить это, я помету ваш ответ. Большое спасибо! – Beta

+0

Нет. Одинаковый разделитель по условию множественного преобразования. Вы использовали «». * [||] "", чтобы извлечь второе условие. Теперь предположим, что у меня 3 условия. Как я получу второе условие, используя это? – Beta

+0

hmm ... тогда, возможно, лучше всего разбить всю колонку на 3 отдельных столбца ... – Sotos

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