首页 > 解决方案 > if 语句根据数据帧中的其他值为数据帧分配值

问题描述

我正在尝试根据“rat_ID”列中的数字在“冲动性”列中分配一个字符串字符(“LI”、“HI”或“MID”)。

我想用 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 值,并为大鼠 #6 提供了“HI”。

标签: rif-statement

解决方案


它为您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")))

推荐阅读