Вставить строки в R на основе факторного условия - PullRequest
0 голосов
/ 21 октября 2018

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

  1. Строка отсутствует после каждой замены масла из-за «сброса».
  2. Мое отсутствие знаний R для вставки строк на основе условий.

Это мой фактический кадр данных;

Before <- data.frame(
  Engine_ID = as.factor(c(1006,1006,1006,1006,1006,1006,1006)),
  Oil_Change = as.factor(c(1,0,1,1,0,0,0)),
  Value = c(5,6,3,7,9,11,12)
)

и это то, что мне нужно;

After <- data.frame(
  Engine_ID = as.factor(c(1006,1006,1006,1006,1006,1006,1006,1006,1006,1006)),
  Oil_Change = as.factor(c(1,NA,0,1,NA,1,NA,0,0,0)),
  Value = c(5,0,6,3,0,7,0,9,11,12)
)

Тогда я смогу выполнить истинную скорость изменения для столбца значений.

Для этого непосредственно после при каждой замене масла (Oil_change == 1) я хотел бы вставить ряд нулей.

Ответы [ 3 ]

0 голосов
/ 21 октября 2018
Before$order <- 1:nrow(Before)

new <- Before[Before$Oil_Change == 1, ]
new$Oil_Change <- NA
new$Value <- 0

After <- rbind(Before, new)

After[order(After$order), ][ , -4]

   Engine_ID Oil_Change Value
1       1006          1     5
11      1006       <NA>     0
2       1006          0     6
3       1006          1     3
31      1006       <NA>     0
4       1006          1     7
41      1006       <NA>     0
5       1006          0     9
6       1006          0    11
7       1006          0    12
0 голосов
/ 21 октября 2018

Если вы понимаете, что вам нужно сделать, я думаю, что может быть много способов сделать это.Ниже приведен способ, которым я мог бы сделать это в соответствии с тем, как я понял, что вам нужно сделать.Это может быть самый неэффективный способ выполнить задачу:

 library(dplyr); library(reshape2)
            newChange  <- mutate(Before, no = c(1:nrow(Before)), 
                                 changeRate = ifelse(as.numeric(as.character(Oil_Change)) > 0, 0,NA)) %>%
                          melt(., id=c('no', 'Engine_ID')) %>%
                          mutate(., no = ifelse(variable =='changeRate', no+0.5,no),
                                 variable = ifelse(variable =='changeRate', 'Value', as.character(variable))) %>%
                          reshape(., direction ='wide', idvar = c('no', 'Engine_ID'), timevar = 'variable') %>%
                          arrange(no) %>% subset(., !(is.na(value.Oil_Change) & is.na(value.Value)))
            names(newChange) <- gsub('value.', '', names(newChange)) 
newChange$no <- NULL 
0 голосов
/ 21 октября 2018
df <- Before

# create a helper column
# which gives number of Oil_Change occurrence before the actual row
df$helper <- cumsum(as.integer(as.character(df$Oil_Change)))
# shift it, so that number changes AFTER the oilchange row
df$helper <- c(0, df$helper[1:(length(df$helper)-1)])

# split data frame by the helper row
dfl <- split(df, df$helper) # look at `dfl` content!

# construct to be added horizontal data row
to.be.added <- t(as.data.frame(c(1006, NA, 0, 0)))
# name it correctly
colnames(to.be.added) <- colnames(df)
rownames(to.be.added) <- 1

# add this list at the end of each sub-data frame
dfl.added <- lapply(dfl, function(df) rbind(df, to.be.added))

# join the sub data frames by rowbinding
res <- Reduce(rbind, dfl.added)

# properly name the rows
rownames(res) <- 1:nrow(res)
# remove helper column
res <- res[, -(ncol(res))] 

# voila!
res # remove last line if you don't want it
   Engine_ID Oil_Change Value
1       1006          1     5
2       1006       <NA>     0
3       1006          0     6
4       1006          1     3
5       1006       <NA>     0
6       1006          1     7
7       1006       <NA>     0
8       1006          0     9
9       1006          0    11
10      1006          0    12
11      1006       <NA>     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...