如何创建一个包含三个基于其他选定变量值的计算的新变量

时间:2014-07-22 11:23:26

标签: r dataframe

我想创建一个新变量,其中包含三个基于所选列的值的计算。 这是我的数据框示例:

 dat <- read.table(text = " cats birds    wolfs     snakes
     0        3        9         7
     1        3        8         7
     1        1        2         3
     0        1        2         3
     0        1        2         3
     1        6        1         1
     0        6        1         1
     1        6        1         1   ",header = TRUE) 

我想创建一个名为dat$full_calc的新变量,它包含以下内容: 如果wolfs==1然后给出值1,如果wolfs==2则给出值20,如果wolfs>=8&amp; snakes=7然后给出值88否则给出值999。 我知道如何使用ifelse命令并且它工作正常,但仅适用于两个条件,所以我正在寻找一种方法来根据上面写的3个条件填充新变量dat$full_calc。 输出应该是:

       cats    birds    wolfs     snakes full_calc
         0        3        9         7      999
         1        3        8         7      88
         1        1        2         3      20
         0        1        2         3      20
         0        1        2         3      20
         1        6        1         1      1
         0        6        1         1      1
         1        6        1         1      1

欢迎任何想法

3 个答案:

答案 0 :(得分:2)

试试这个:

dat$full_calc <- with(dat, ifelse(wolfs == 1, 1, 
                             ifelse(wolfs == 2, 20,
                                      ifelse(wolfs >= 8 & snakes == 7, 88, 999))))

您可以在内部嵌套多个ifelse个数字。

答案 1 :(得分:2)

如果您愿意使用data.table包,则更新表的功能非常透明且易于理解。

#Bring in data.table
require(data.table)
setDT(dat)

#Develop full_calc
dat[ , full_calc := 999]
dat[wolfs==1 , full_calc := 1]
dat[wolfs==2 , full_calc := 20]
dat[wolfs>=8 & snakes==7 , full_calc := 88]

答案 2 :(得分:1)

您也可以尝试:

  indx <- with(dat, cbind(wolfs==1, wolfs==2, wolfs>=8 & snakes==7))
  dat$full_calc <- c(cbind(indx, !rowSums(indx))%*%c(1,20,88,999))
  dat$full_calc   #please check the first value in your expected output 
  #[1] 88 88 20 20 20  1  1  1 

假设,如果

  dat$snakes[1] <- 6
  indx <- with(dat, cbind(wolfs==1, wolfs==2, wolfs>=8 & snakes==7))
   c(cbind(indx, !rowSums(indx))%*%c(1,20,88,999))
  #[1] 999  88  20  20  20   1   1   1