оператор if для присвоения значений фрейму данных на основе других значений в фрейме данных - PullRequest
1 голос
/ 05 октября 2019

Я пытаюсь присвоить строковый символ («LI», «HI» или «MID») в столбце «импульсивность» на основе чисел в столбце «rat_ID».

Я думал сделать это с помощью оператора if, но я не могу заставить его работать

mydat1 <- data.frame("rat_ID" = 1:6, "Prem" = c(0,0,0,1,0,1), "Corr" = c(1,1,0,0,0,0), "Incorr" = c(0,0,0,0,1,0))

mydat1$rat_ID = as.numeric(mydat1$rat_ID)

for (i in length(mydat1$Corr)) {
  if (mydat1$rat_ID[i]==1 | mydat1$rat_ID[i]==6) {
  mydat1$impulsivity[i] = 'HI'
} else if (mydat1$rat_ID[i]==3 | mydat1$rat_ID[i]==4) {
  mydat1$impulsivity[i] = 'LI'
} else {
  mydat1$impulsivity[i] = 'MID'
} 
}

По какой-то причине он дает значения NA для большинства животных и "HI" для крысы #6.

Ответы [ 2 ]

2 голосов
/ 05 октября 2019

Причина, по которой он дает вам NA для всех значений, кроме последнего, заключается в том, что ваш цикл работает только для последнего значения. В вашем цикле for выполните

for (i in 1:length(mydat1$Corr)) {
  .....
  .....

Помимо цикла for есть и другие подходы, которые вы можете рассмотреть. Один с dplyr, case_when

library(dplyr)

mydat1 %>%
   mutate(impulsivity = case_when(rat_ID %in% c(1, 6) ~ "HI", 
                                  rat_ID %in% c(3, 4) ~"LI", 
                                  TRUE ~ "MID"))

#  rat_ID Prem Corr Incorr impulsivity
#1      1    0    1      0          HI
#2      2    0    1      0         MID
#3      3    0    0      0          LI
#4      4    1    0      0          LI
#5      5    0    0      1         MID
#6      6    1    0      0          HI

ИЛИ ifelse в базе R

mydat1$impulsivity <- with(mydat1, ifelse(rat_ID %in% c(1, 6), "HI",
                      ifelse(rat_ID %in% c(3, 4), "LI", "MID")))
1 голос
/ 05 октября 2019

Вы можете использовать case_when из пакета dplyr, например

> library(dplyr)
> mydat1 <- data.frame("rat_ID" = 1:6, "Prem" = c(0,0,0,1,0,1), "Corr" = c(1,1,0,0,0,0), "Incorr" = c(0,0,0,0,1,0))
> mydat1$rat_ID = as.numeric(mydat1$rat_ID)
> mydat1 %>% mutate(Impulsivity = case_when(rat_ID %in% c(1, 6) ~ 'low',
+                                           rat_ID == 5 ~ 'high',
+                                           TRUE ~ 'something else'))
  rat_ID Prem Corr Incorr    Impulsivity
1      1    0    1      0            low
2      2    0    1      0 something else
3      3    0    0      0 something else
4      4    1    0      0 something else
5      5    0    0      1           high
6      6    1    0      0            low
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...