Как я могу условно изменить значение переменной на основе значения другой переменной? - PullRequest
2 голосов
/ 22 октября 2019

У меня есть две переменные;МАРКСВ1201 и МАРКСВА1201. MARKSVA1201 имеет значение только в случае отсутствия MARKSV1201, иначе это только испортит мой анализ.

Я пытаюсь написать скрипт, который устанавливает для MARKSVA1201 значение «0» всякий раз, когда записывается значение для MARKSV1201

if(!is.na(test$`MARKSV1201     `)){test$`MARKSVA1201    `=0}

Однако это не работает, однако программа жалуется, что "условие> 1 и будет использоваться только первый элемент "

Вместо этого я пытаюсь использовать оператор ifelse, так как я работаю с векторами:

ifelse(!is.na(test$`MARKSV1201     `),test$`MARKSVA1201    `,test$`MARKSVA1201    `==test$'MARKSVA1201    ')

Это работает, но яполучаю только логический вектор.

Как мне условно изменить фактические значения?

Снимок данных:

    structure(list(`MARKSV1201     ` = structure(c(NA, NA, 8L, 8L, 
NA, 8L, NA, 6L, 8L, 6L, 6L, 6L, 8L, 6L, 8L, 6L, 6L, 8L, 6L, 6L, 
NA, 8L, 8L, 7L, 7L, 8L, NA, 8L, 6L, 8L, NA, 6L, 8L, 6L, 8L, 8L, 
NA, NA, NA, NA, NA, NA, NA, 6L, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA), .Label = c("A  ", "B  ", "C  ", 
"D  ", "E  ", "G  ", "MVG", "VG "), class = "factor"), `MARKSVA1201    ` = structure(c(NA, 
NA, NA, NA, NA, NA, 6L, NA, NA, NA, NA, NA, NA, 6L, NA, NA, NA, 
NA, NA, NA, 6L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), .Label = c("A  ", 
"B  ", "C  ", "D  ", "E  ", "G  ", "MVG", "VG "), class = "factor")), row.names = c(1L, 
5L, 9L, 12L, 15L, 18L, 21L, 24L, 27L, 30L, 34L, 37L, 43L, 46L, 
50L, 53L, 59L, 62L, 65L, 68L, 71L, 74L, 80L, 83L, 86L, 89L, 92L, 
98L, 101L, 104L, 107L, 110L, 113L, 116L, 119L, 122L, 125L, 128L, 
134L, 137L, 140L, 146L, 149L, 155L, 161L, 167L, 170L, 173L, 176L, 
182L, 185L, 188L, 191L, 195L, 198L, 201L, 204L, 207L, 213L, 216L, 
219L, 225L, 228L, 231L, 237L, 243L, 249L, 252L, 255L, 258L, 261L, 
264L, 267L, 276L, 282L, 285L, 288L, 291L, 294L, 297L, 300L, 303L, 
306L, 309L, 312L, 315L, 321L, 324L, 327L, 330L, 333L, 336L, 339L, 
342L, 345L, 348L, 354L, 357L, 360L, 363L, 366L, 372L, 375L, 381L, 
384L, 387L, 390L, 393L, 396L, 399L, 402L, 405L, 408L, 411L, 414L, 
417L, 420L, 423L, 426L, 429L, 435L, 438L, 441L, 444L, 447L, 450L, 
453L, 456L, 459L, 462L, 465L, 468L, 471L, 474L, 477L, 480L, 483L, 
486L, 489L, 492L), reshapeWide = list(v.names = "QUAL_RATING", 
    timevar = "SEL_CRITERION", idvar = "PNR", times = structure(3:1, .Label = c("BI   ", 
    "BII  ", "HP   "), class = "factor"), varying = structure(c("QUAL_RATING.HP   ", 
    "QUAL_RATING.BII  ", "QUAL_RATING.BI   "), .Dim = c(1L, 3L
    ))), class = "data.frame")

Ответы [ 2 ]

3 голосов
/ 22 октября 2019

Это должно сделать это сейчас.

#rename the columns for convenience 
names(df) <- c("MARKSV1201", "MARKSVA1201")

# coerce the df to char 
df[] <- lapply(df, as.character)

# Use the ifelse
df$MARKSVA1201 <- ifelse(!is.na(df$MARKSV1201), 0, df$MARKSVA1201)

# coerce it back to its original factor 
df[] <- lapply(df, as.factor)

#output
#   Marksv1201 MARKSVA1201
# 1        <NA>          NA
# 5        <NA>          NA
# 9         VG            0
# 12        VG            0
# 15       <NA>          NA
# 18        VG            0

Ввод

# df
#   MARKSV1201      MARKSVA1201    
# 1             <NA>            <NA>
# 5             <NA>            <NA>
# 9              VG             <NA>
# 12             VG             <NA>
# 15            <NA>            <NA>
# 18             VG             <NA>

Вы можете проверить структуру, используя str(df), чтобы исследовать класс переменных и приводить туда-сюда при необходимости.

0 голосов
/ 22 октября 2019

Существует проблема, так как ваши столбцы имеют тип factor. Вы можете попробовать что-то в строках

zz$`MARKSVA1201    ` = as.character(zz$`MARKSVA1201    `)
zz$`MARKSVA1201    `[is.na(zz$`MARKSV1201     `)] = 0
df$MARKSVA1201=as.factor(df$MARKSVA1201)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...