【问题标题】:How do I conditionally change the value of a variable based on the value of another variable?如何根据另一个变量的值有条件地更改变量的值?
【发布时间】:2020-02-18 15:44:07
【问题描述】:

我有两个变量; MARKSV1201 和 MARKSVA1201。 MARKSVA1201 只有在 MARKSV1201 缺失时才有意义,否则只会打乱我的分析。

每当记录 MARKSV1201 的值时,我都会尝试编写一个将 MARKSVA1201 设置为“0”的脚本

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")

【问题讨论】:

    标签: r if-statement conditional-statements


    【解决方案1】:

    现在应该这样做了。

    #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) 检查结构以检查变量的类并根据需要来回强制。

    【讨论】:

    • 这似乎可行,尽管“MARKSVA1201”的一些值不知何故被转换为“6”,我不明白。
    • 这很不寻常,然后我会更新添加我的输出。当你做table(df$MARKSVA1201)时你看到了什么?
    • 我得到(插入无意义的括号,因为最小长度)0 6 30 2
    • 第一个“6”直到第 7 次观察才出现,我应该将填充输入粘贴到问题中吗?
    • 在应用ifelse之前?
    【解决方案2】:

    存在问题,因为您的列是 factor 类型。你可以试试

    zz$`MARKSVA1201    ` = as.character(zz$`MARKSVA1201    `)
    zz$`MARKSVA1201    `[is.na(zz$`MARKSV1201     `)] = 0
    df$MARKSVA1201=as.factor(df$MARKSVA1201)
    

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 2020-01-02
      • 1970-01-01
      • 2021-02-22
      • 2022-01-10
      • 2016-11-01
      • 2021-07-04
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多