Заменить ненулевые значения кадра данных - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть фрейм данных, который выглядит как пример данных ниже.

> 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. Я могу сделать это двумя способами.

  1. Использование одного столбца за раз для замены, как показано ниже. Затем мне нужно каждый раз менять имена столбцов.

    df$Requirement[df$Requirement != 0] <- 1

  2. Я могу написать базовый цикл 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

Было бы замечательно решение или предложение.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018
df1[-1] <- + sapply(df1[-1], as.logical)

#   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

  • При использовании as.logical каждый 0 получает FALSE (0), каждый n >= 1 получает TRUE (1)
  • При добавлении + тип будет приведен к целым числам.
0 голосов
/ 01 ноября 2018

Просто дополнение к предыдущим ответам.

df[-1] <- as.numeric(df[-1] != 0)
df[-1] <- as.numeric(df[-1] != 0, as.logical)
df[-1] <- as.numeric(as.logical(df[-1] != 0))
0 голосов
/ 01 ноября 2018

Вы могли бы сделать

df[-1] <- as.integer(df[-1] != 0)
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           0          1           0       1      0      1
#5          WG           0          0           1       0      1      0
#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

Если у вас есть несколько нецифровых столбцов и вам нужно сначала найти их позиции, вы можете сделать

numeric_cols <- vapply(df, is.numeric, logical(1))
df[numeric_cols] <- as.integer(df[numeric_cols] != 0)
df
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...