2015-09-25 3 views
0

У меня есть большой набор данных, который имеет шаблон, похожий на dataPattern ниже. Мне нужна помощь с кодом для создания desiredresult набора данныхСоздание новых столбцов на основе шаблона

library(data.table)  

V1 <- rep(c(rep("a", times = 2), letters[2:5], 
        rep("f", times = 2)), times = 2) 


V2 <- c(c(c(0.24, 0.25), 2:5, c(0.95, 1.05)), 
       c(c(0.34, 0.35), 2:5, c(1.95, 2.05))) 

(dataPattern <- data.table(V1, V2)) 

(desiredresult <- data.table(V1, V2, c(rep(c(0.24, 0.25), times = 4), 
          rep(c(0.34, 0.35), times = 4)), 
        c(rep(c(0.95, 1.05), times = 4), 
          rep(c(1.95, 2.05), times = 4)))) 

мне нужна помощь, чтобы создать столбец V3 в desiredresult. Картина выглядит следующим образом:

если таковые V1 == "a" затем V3 = V2 , если V1 != "a" мы не повторить предыдущий соответствующий набор V2 значений до тех пор, новое значение a достигается то новые значения V2 помещают в V3 и т.д. выше повторы для всех новых значений a.

мне нужна ваша помощь с кодом, чтобы создать столбец V4 в desiredresult, который похож на колонке V3 кроме он проверяет V1 == "f" и помещает значения f из V2 в V4 и повторяет его, если V1 != "f"

I попробовал:

rle(dataPattern$V1 == "a") 
# Run Length Encoding 
    # lengths: int [1:4] 2 6 2 6 
    # values : logi [1:4] TRUE FALSE TRUE FALSE 

последовательность где V1 != "a" или V1 != "f" оказывается равным числу FALSE минус Номер TRUE. Это сколько раз нужно каждый a последовательности будет повторяться, пока новый a не будет достигнут

Большого спасибо

+0

Есть ли «f V1! =« A », мы повторяем предыдущий набор значений до тех пор, пока не будет достигнуто новое значение a, тогда новые значения V2 будут помещены в V3« действительно означает быть «f V1! =» A «мы повторяем предыдущий набор значений V1 до тех пор, пока не будет достигнуто новое значение a, а новые значения V2 будут помещены в V3»? –

+0

Шон, вот что я имел в виду: если «a» находится в «V1», скопируйте значения V2 в «V3». Если «a» не найден в «V1», повторите вышеуказанные значения V2 до «V3» до тех пор, пока новое значение не будет найдено в «V1» –

ответ

0

ОК, вот лучший способ, я думаю, чтобы получить значения V2 в столбце в зависимости от V1=='a'.

V1 <- rep(c(rep("a", times = 2), letters[2:5], 
      rep("f", times = 2)), times = 2) 

V2 <- c(c(c(0.24, 0.25), 2:5, c(0.95, 1.05)), 
     c(c(0.34, 0.35), 2:5, c(1.95, 2.05))) 

dataPattern <- data.frame(V1, V2) 
dataPattern$V3 <- ifelse(dataPattern$V1 == "a", dataPattern$V2, NA) 
dataPattern$V4 <- ifelse(dataPattern$V1 == "f", dataPattern$V2, NA) 
for (i in 1:nrow(dataPattern)){ 
    if (dataPattern$V1[i] == "a"){ 
     tmpa <- dataPattern$V3[i] 
    } 
    if (is.na(dataPattern$V3[i])){ 
     dataPattern$V3[i] <- tmpa 
    } 
    if (dataPattern$V1[nrow(dataPattern)-(i-1)] == "f"){ 
     tmpf <- dataPattern$V4[nrow(dataPattern)-(i-1)] 
    } 
    if (is.na(dataPattern$V4[nrow(dataPattern)-(i-1)])){ 
     dataPattern$V4[nrow(dataPattern)-(i-1)] <- tmpf 
    } 
} 

выход, который я считаю более правильным, в соответствии с вашими заявленными правилами, чем desiredoutput:

> dataPattern 
    V1 V2 V3 V4 
1 a 0.24 0.24 0.95 
2 a 0.25 0.25 0.95 
3 b 2.00 0.25 0.95 
4 c 3.00 0.25 0.95 
5 d 4.00 0.25 0.95 
6 e 5.00 0.25 0.95 
7 f 0.95 0.25 0.95 
8 f 1.05 0.25 1.05 
9 a 0.34 0.34 1.95 
10 a 0.35 0.35 1.95 
11 b 2.00 0.35 1.95 
12 c 3.00 0.35 1.95 
13 d 4.00 0.35 1.95 
14 e 5.00 0.35 1.95 
15 f 1.95 0.35 1.95 
16 f 2.05 0.35 2.05 
+0

Shawn, это не приведет к созданию набора данных «wishresult» –

+0

Справа, объясните 'V4 'значения, снова? Что происходит, например, с первыми значениями 'V4', пока не будет достигнуто' V1 == 'f''? В чем ценность? 'V4 [1: 6] чередуются между' .95' и '1.05', прежде чем эти значения появятся в' V1'. –

+0

То же самое относится к 'V4', как к' V3', за исключением противоположного порядка. В то время как 'V3' сначала ищет' 'a '(V1 [1: 2])', а затем переходит к 'V1 [3: 8]', 'V4' работает в противоположном направлении. 'V4' ищет' 'f" (V1 [8: 7]) 'и переходит назад к' V1 [6: 1] '. –

0

Это похоже на работу:

dataPattern[, `:=`(
    V3 = head(V2,2), 
    V4 = tail(V2,2) 
), by=cumsum(V1 == "a" & shift(V1,type="lead") == "a")] 

В результате проходит all.equal(dataPattern, desiredresult) проверку , В зависимости от того, как выглядит ваш фактический пример использования, вам может потребоваться поставить что-то другое внутри cumsum.

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