我想创建一个新变量,其中包含三个基于所选列的值的计算。 这是我的数据框示例:
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
欢迎任何想法
答案 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