У меня есть фрейм данных, который выглядит как пример данных ниже.
> dput(df)
structure(list(BranchCode = structure(c(9L, 3L, 2L, 1L, 10L,
6L, 8L, 11L, 4L, 5L, 7L), .Label = c("BU", "CA", "GT", "IN",
"LM", "OX", "QC", "SR", "TD", "WG", "YV"), class = "factor"),
Requirement = c(0L, 5L, 12L, 1L, 0L, 0L, 6L, 0L, 3L, 10L,
0L), Availabile = c(3L, 3L, 0L, 7L, 0L, 8L, 0L, 0L, 7L, 3L,
6L), Alternative = c(9L, 0L, 0L, 0L, 10L, 2L, 3L, 8L, 0L,
0L, 5L), Complex = c(3L, 2L, 7L, 5L, 0L, 0L, 7L, 2L, 0L,
6L, 3L), Level1 = c(0L, 6L, 0L, 0L, 6L, 0L, 9L, 0L, 0L, 0L,
0L), Level2 = c(4L, 0L, 0L, 8L, 1L, 6L, 10L, 18L, 0L, 3L,
5L)), .Names = c("BranchCode", "Requirement", "Availabile",
"Alternative", "Complex", "Level1", "Level2"), class = "data.frame", row.names = c(NA,
-11L))
Мне нужно заменить все ненулевые значения на числовые 1. Я могу сделать это двумя способами.
Использование одного столбца за раз для замены, как показано ниже. Затем мне нужно каждый раз менять имена столбцов.
df$Requirement[df$Requirement != 0] <- 1
Я могу написать базовый цикл for
и заменить его на основе условия, пройдя через индекс.
Но оба процесса занимают у меня время, потому что каждый раз столбцы или строки будут увеличиваться (иногда 200 столбцов и 20000 строк). Так что я хочу сделать этот процесс на весь массив данных одновременно. Как и без замены столбца за столбцом или перехода по индексу цикла for на фрейме данных, мне нужно заменить, где есть ненулевое числовое значение, на цифру 1. Что-то вроде ниже (но не работает).
df[which(df[2:7] != 0)] <- 1
Окончательный кадр данных будет выглядеть ниже.
> df
BranchCode Requirement Availabile Alternative Complex Level1 Level2
1 TD 0 1 1 1 0 1
2 GT 1 1 0 1 1 0
3 CA 1 0 0 1 0 0
4 BU 1 1 0 1 0 1
5 WG 0 0 1 0 1 1
6 OX 0 1 1 0 0 1
7 SR 1 0 1 1 1 1
8 YV 0 0 1 1 0 1
9 IN 1 1 0 0 0 0
10 LM 1 1 0 1 0 1
11 QC 0 1 1 1 0 1
Было бы замечательно решение или предложение.