我需要使用两组顺序标记的变量来应用函数,并将新的变量集附加到数据框。我需要在不参考代码中的列号的情况下执行此操作。
更具体地说,这是我正在尝试的简单任务:
dat <- data.frame(sec1 = sample(c(0:3),10,replace=T) , sec2 = sample(c(0:4),replace=T) , sec3 = sample(c(0:4),replace=T),pri1 = sample(c(0:3),10,replace=T) , pri2 = sample(c(0:4),replace=T) , pri3 = sample(c(0:4),replace=T) )
dat$rel1 <- ifelse(dat$pri1>0,dat$sec1/dat$pri1,NA)
dat
我想重复&#34; ifelse&#34;上面显示的函数没有为每组变量重复输入。
我必须说,我之前提出了类似的问题并收到了有用的答案(eg1和eg2),但在这种情况下,答案要么使用代码中的列号,要么示例是单组顺序标记的变量。我无法修改建议的代码来解决这个特定的问题。
非常感谢任何建议。
答案 0 :(得分:3)
dat_n <- cbind(dat, mapply(function(x, y) ifelse(y>0,x/y,NA) ,dat[grepl("sec",names(dat))], dat[grepl("pri",names(dat))]))
> dat_n
sec1 sec2 sec3 pri1 pri2 pri3 rel1 sec1 sec2 sec3
1 2 1 2 3 3 0 0.6666667 0.6666667 0.3333333 NA
2 3 3 4 0 2 4 NA NA 1.5000000 1.00
3 1 0 3 1 4 4 1.0000000 1.0000000 0.0000000 0.75
4 2 4 1 3 3 2 0.6666667 0.6666667 1.3333333 0.50
5 2 0 2 3 4 1 0.6666667 0.6666667 0.0000000 2.00
6 1 1 2 1 3 0 1.0000000 1.0000000 0.3333333 NA
7 1 3 4 0 2 4 NA NA 1.5000000 1.00
8 1 0 3 1 4 4 1.0000000 1.0000000 0.0000000 0.75
9 3 4 1 2 3 2 1.5000000 1.5000000 1.3333333 0.50
10 1 0 2 2 4 1 0.5000000 0.5000000 0.0000000 2.00
答案 1 :(得分:1)
您可以在Vectorize
上使用ifelse
并对其进行大量清理
set.seed(1)
dat <- data.frame(sec1 = sample(c(0:3),10,replace=T) , sec2 = sample(c(0:4),replace=T) , sec3 = sample(c(0:4),replace=T),pri1 = sample(c(0:3),10,replace=T) , pri2 = sample(c(0:4),replace=T) , pri3 = sample(c(0:4),replace=T) )
dat$rel1 <- ifelse(dat$pri1>0,dat$sec1/dat$pri1,NA)
dat
f <- Vectorize(function(x, y) ifelse(y > 0, x / y, NA))
f(dat[1:3], dat[4:6])
# sec1 sec2 sec3
# [1,] 0.3333333 0.50 0.6666667
# [2,] NA 0.00 1.0000000
# [3,] 1.0000000 1.50 NA
# [4,] NA NA 0.3333333
# [5,] 0.0000000 0.75 1.5000000
# [6,] 3.0000000 0.50 0.6666667
# [7,] NA 0.00 1.0000000
# [8,] 2.0000000 1.50 NA
# [9,] 0.6666667 NA 0.3333333
# [10,] 0.0000000 0.75 1.5000000
v <- lapply(c('sec','pri'), function(x) grep(x, names(dat)))
cbind(dat, `colnames<-`(f(dat[v[[1]]], dat[v[[2]]]), paste0('rel',1:3)))
# sec1 sec2 sec3 pri1 pri2 pri3 rel1 rel1 rel2 rel3
# 1 1 1 2 3 2 3 0.3333333 0.3333333 0.50 0.6666667
# 2 1 0 3 0 2 3 NA NA 0.00 1.0000000
# 3 2 3 4 2 2 0 1.0000000 1.0000000 1.50 NA
# 4 3 1 1 0 0 3 NA NA NA 0.3333333
# 5 0 3 3 1 4 2 0.0000000 0.0000000 0.75 1.5000000
# 6 3 1 2 1 2 3 3.0000000 3.0000000 0.50 0.6666667
# 7 3 0 3 0 2 3 NA NA 0.00 1.0000000
# 8 2 3 4 1 2 0 2.0000000 2.0000000 1.50 NA
# 9 2 1 1 3 0 3 0.6666667 0.6666667 NA 0.3333333
# 10 0 3 3 1 4 2 0.0000000 0.0000000 0.75 1.5000000
(哟dawg我听说你喜欢矢量化,所以我们在你的矢量化中放了一些Vectorize
,这样你可以在你矢量化时Vectorize