проходя через фрейм данных, затем применить множитель к определенным строкам в R - PullRequest
0 голосов
/ 09 ноября 2018

Я смотрю на прогон через фрейм данных с именем комбинированный_пред, и, если эта строка содержит определенное значение, применяет множитель к другому значению в пределах определенного столбца этой же строки.

Я думаю, что лучший способ сделать это - иметь цикл for для запуска через фрейм данных, а затем иметь оператор if, чтобы проверить, есть ли это значение, и сделать это, если не сделать что-то еще, чтобы сделать другой столбец в том же самом строка.

например:

датафрейм комбинированныйпред:

monday | Tuesday     | Wednesday | Thurday    | class
0.99   |  0.2643     |   0.234   |  0.22343   | Maths
0.32   |  0.2123     |   0.22    |  0.63      | Science
0.233  |  0.6423     |   0.24    |  0.73      | English

как я думаю, код будет выглядеть так:

for(i in 1:nrow(combinedpred)) {
  if (conbinedpred[i] %in% 'class'){
     combinedpred[i,"Maths"] * 1.5
  } if (conbinedpred[i] %in% 'class') {
     combinedpred[i,"English"| "science"] * 1.9
  } if (conbinedpred[i] %in% 'class') {
    combinedpred[i,"history"] * 1.1
  }
}

Итог:

, поскольку в первом столбце есть математика, примените к нему множитель 1,5 к столбцу понедельника, но только в этой строке. Я просто понимаю, что на примере выше это немного неправильно.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Использование dplyr скорее всего будет чище и быстрее, как для запуска, так и для ввода:

library(dplyr)

df <- data.frame(
    x = as.character(LETTERS[1:10]),
    y = 1:10
)

df %>% 
    mutate(
        y = ifelse(x == "D", y * 100, y)
    )

Другим способом, с помощью dplyr, также может быть добавление столбца, содержащего множители.

df <- data.frame(
    x = as.character(LETTERS[1:3]),
    y = 1:3,
    z = runif(3),
    multipliers = c(5, .3, .2)
)

df %>% 
    mutate(
        y = y * multipliers, # multiply
        z = z * multipliers
    ) %>% 
    select(-multipliers) # remove multipliers

Ниже приведено полное решение: создайте data.frame, который содержит множитель, соответствующий каждому классу, объедините их и затем умножьте. Чище, быстрее, проще в обслуживании.

multipliers <- data.frame(
    class = LETTERS[1:3],
    multiplier = c(.3, 5, 100)
)

df <- data.frame(
    class = sample(LETTERS[1:3], 100, replace = TRUE),
    x = runif(100),
    y = runif(100)
)

df %>% 
    left_join(multipliers, by = "class") %>% 
    mutate(
        x = x * multiplier,
        y = y * multiplier
    ) %>% 
    select(-multiplier)
0 голосов
/ 09 ноября 2018

Это то, что вы хотите. Умножьте всю строку с правильным множителем, основанным на class.

lookupTable <- c(Maths = 1.5, Science= 1.9, English= 1.9, History = 1.1)
df1$multipl <- lookupTable[df1$class]

df1[,1:4] <- df1[,1:4] * df1$multipl

df1 <-
structure(list(monday = c(0.99, 0.32, 0.233), Tuesday = c(0.2643, 
0.2123, 0.6423), Wednesday = c(0.234, 0.22, 0.24), Thurday = c(0.22343, 
0.63, 0.73), class = c("Maths", "Science", "English")), row.names = c(NA, 
-3L), class = "data.frame")
0 голосов
/ 09 ноября 2018

Цикл не является оптимальным, вы должны попробовать это:

conbinepred$monday <- ifelse(conbinepred$class=="Maths", conbinepred$monday*1.5, ifelse(conbinepred$class=="Science", conbinepred$monday*1.9, conbinepred$monday*1.1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...