Условное изменение значения по столбцам - PullRequest
0 голосов
/ 24 сентября 2018

Мне нужно вычислить, когда значение переключается между 0 и 1, значения распределяются по столбцам, переключатель не задан, а NA присутствуют.

Я попытался с mutate и rowSums снебольшие результаты.

Пример:

df <- data.frame(entry = c(1:5), 
                year_1 = c(NA, NA, NA, 1, NA),
                year_2 = c(NA, NA, 0, 0, 1),
                year_3 = c(NA, 1, 1, 0, 1))

Желаемый результат:

switch = c(NA, NA, "year_2", NA, NA)

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Чтобы рассчитать изменения по столбцам, вы можете взять разницу между «опережающими» и «запаздывающими» версиями (по столбцам) данных.Получите индексы для разностей 1 и используйте их для создания «переключателя»:

ix <- which(df[ , 3:ncol(df)] - df[ , 2:(ncol(df) - 1)] == 1, arr.ind = TRUE) 
df$switch <- NA
df$switch[ix[ , 1]] <- paste0("year_", ix[ , 2])

df
#   entry year_1 year_2 year_3 switch
# 1     1     NA     NA     NA   <NA>
# 2     2     NA     NA      1   <NA>
# 3     3     NA      0      1 year_2
# 4     4      1      0      0   <NA>
# 5     5     NA      1      1   <NA>
0 голосов
/ 24 сентября 2018
l <- apply(df[, -1], 1, function(x) 
        names(df)[1 + which(tail(x, -1) == 1 & head(x, -1) == 0)])
unlist(ifelse(lengths(l), l, NA))

# [1] NA       NA       "year_2" NA       NA  
...