R: изменение некоторых значений столбца, но не всех, на основе значений других столбцов: проблемы с ifelse () и if () {} - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу изменить определенные значения в одном столбце (B), если определенное значение появляется в другом столбце (A), но в противном случае значения столбца остаются неизменными.Например, в следующей упрощенной версии моих данных я хочу изменить значение в столбце B на «0», если значение в столбце A равно «none», в противном случае я хочу, чтобы значения в столбце B не изменились

df <- data.frame(ID=c(1:4),A=c("1/wk","none","1/mo","1/wk"),B=c("3",NA,NA,"depends"))
    > df
      ID    A       B
    1  1 1/wk       3
    2  2 none    <NA>
    3  3 1/mo    <NA>
    4  4 1/wk depends

Я пробовал это

df$B <- ifelse(df$A == "none","0",df$B)
    > df
      ID    A    B
    1  1 1/wk    1
    2  2 none    0
    3  3 1/mo <NA>
    4  4 1/wk    2

Хотя это меняет идентификатор 2 на «0» в столбце B (который я хочу), он также меняет другие значения в столбце B. Я хочу, чтобы мой выводчтобы выглядеть так:

> df
  ID    A       B
1  1 1/wk       3
2  2 none       0
3  3 1/mo    <NA>
4  4 1/wk depends

Я также пытался использовать if () {}, но не могу понять, как его использовать, когда задействовано несколько столбцов

Я не особоо том, какую функцию использовать (хотя я предпочитаю ответы, которые используют базу R).PS - хотя я нашел похожие вопросы по stackoverflow, ни один из ответов не сработал для меня.

Ответы [ 2 ]

3 голосов
/ 01 апреля 2019

Попробуйте создать фрейм данных без использования факторов:

df <- data.frame(ID=c(1:4),
                 A=c("1/wk","none","1/mo","1/wk"),
                 B=c("3",NA,NA,"depends"),
                 stringsAsFactors=FALSE)      # add this
df$B <- ifelse(df$A == "none","0",df$B)
df

  ID    A       B
1  1 1/wk       3
2  2 none       0
3  3 1/mo    <NA>
4  4 1/wk depends

Проблема со сравнением состоит в том, что вы делаете это для факторов уровней, а не для значений, которые они представляют.

Вот что происходит с вашим текущим сравнением:

df$A [
    "1/wk" != "none"  => "1" (first factor level of df$B)
    "none" == "none"  => "0" (the comparison having been true)
    "1/mo" != "none"  => NA  (comparison failed, NA still NA for factors)
    "1/wk" != "none"  => "2" (second factor level of df$B)
]
0 голосов
/ 01 апреля 2019

Проблема в том, что по умолчанию ваши столбцы не символьные векторы, а факторы.

Попробуйте это:

df <- data.frame(ID=c(1:4),A=c("1/wk","none","1/mo","1/wk"),B=c("3",NA,NA,"depends"), stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...