Замена значений в строках на основе наличия определенного значения в строке - PullRequest
0 голосов
/ 30 января 2019

Вот набор данных, с которым я работаю:

ID    x1    x2    x3    x4        x5        
1     0     0     1     .25       .25
2     0     .5    .5    1         Complete
3     0     .25   .25   .5        .75 
4     0     .5    1     Complete  Complete

Когда вы видите, что значение 1 встречается в строке, все оставшиеся значения в этой строке должны отображаться как «Завершено».Я пытаюсь исправить проблему с этими данными, из которой видно, что хотя бы одна строка не соответствует этому правилу (строка 1).Я хочу найти способ с помощью цикла for, mutate in tidy и т. Д. Циклически проходить по моему набору данных и читать каждую строку, пока не будет найдено значение 1 в этой строке, если это применимо.Если он находит это значение 1, пусть он заменит все оставшиеся значения на «Завершить» в этой строке, так как в любом случае это должно быть значение по умолчанию.

Вот как должны выглядеть данные:

ID    x1    x2    x3    x4        x5        
1     0     0     1     Complete  Complete
2     0     .5    .5    1         Complete
3     0     .25   .25   .5        .75 
4     0     .5    1     Complete  Complete

Теперь у меня есть:

for(i in 1:nrow(data)){ position <- which(data[i, ]==1)
                        data[,position+1] <- "Complete" }

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Другой подход tidyverse может быть следующим:

df %>%
 gather(var, val, -ID) %>%
 group_by(ID) %>%
 mutate(val = ifelse(row_number() > row_number(val == "1"), "Complete", val)) %>%
 spread(var, val)

     ID x1    x2    x3    x4       x5      
  <int> <chr> <chr> <chr> <chr>    <chr>   
1     1 0     0     1     Complete Complete
2     2 0     0.5   0.5   1        Complete
3     3 0     0.25  0.25  .5       .75     
4     4 0     0.5   1     Complete Complete

На первом этапе он преобразует данные из широкого в длинный формат.Во-вторых, он присваивает значение «Завершено», если номер строки (на группу) больше номера строки в строке со значением 1. Наконец, он преобразует данные обратно в исходный формат.

0 голосов
/ 31 января 2019

Решение "старой школы":

ncol <- dim(data)[2]
for (i in 1:nrow(data)){
  position <- which(data[i, 2:ncol] == 1) + 1 
  if (length(position) != 0) {
    data[i, (position + 1):ncol] <- "Complete"
  }
}
data

  ID x1   x2   x3       x4       x5
1  1  0 0.00 1.00 Complete Complete
2  2  0 0.50 0.50        1 Complete
3  3  0 0.25 0.25       .5      .75
4  4  0 0.50 1.00 Complete Complete
0 голосов
/ 30 января 2019

Проверьте это решение:

library(dplyr)
library(tidyr)
df %>%
  gather(key, val, x1:x5) %>%
  group_by(ID) %>%
  mutate(
    check = val == 1,
    check = cumsum(check),
    val = if_else(
      val < 1 & check == 1 | val == 1 & check > 1,
      'Complete',
      as.character(val)
    )
  ) %>%
  select(-check) %>%
  spread(key, val)
...