从字符串中的条件创建虚拟变量
Create a dummy variable from condition in a string
我有一些数据
data
Y X1 X2
1 21.0 160.0 2.620
2 21.0 160.0 2.875
3 22.8 108.0 2.320
4 21.4 258.0 3.215
5 18.7 360.0 3.440
6 18.1 225.0 3.460
7 14.3 360.0 3.570
8 24.4 146.7 3.190
9 22.8 140.8 3.150
10 19.2 167.6 3.440
11 17.8 167.6 3.440
12 16.4 275.8 4.070
13 17.3 275.8 3.730
14 15.2 275.8 3.780
15 10.4 472.0 5.250
16 10.4 460.0 5.424
17 14.7 440.0 5.345
18 32.4 78.7 2.200
19 30.4 75.7 1.615
20 33.9 71.1 1.835
21 21.5 120.1 2.465
22 15.5 318.0 3.520
23 15.2 304.0 3.435
24 13.3 350.0 3.840
25 19.2 400.0 3.845
26 27.3 79.0 1.935
27 26.0 120.3 2.140
28 30.4 95.1 1.513
29 15.8 351.0 3.170
30 19.7 145.0 2.770
31 15.0 301.0 3.570
32 21.4 121.0 2.780
和条件列表:
a
[[1]]
[1] "X2>=2.393"
[[2]]
[1] "X2< 2.393"
[[3]]
[1] "X2>=2.393" "X1>=266.9"
[[4]]
[1] "X2>=2.393" "X1< 266.9"
我如何根据这些条件在我的数据中创建新的虚拟变量,而不是每次数据 $X2>=2.393 等都手动写入?如何将字符串中的条件与数据框合并?
我的解决方案是:
> R1<-as.numeric(I( data$X2>=2.393))
> R2<-as.numeric(I( data$X2< 2.393))
> R3<-as.numeric(I( data$X2>=2.393)*I( data$X1>=266.9))
> R4<-as.numeric(I( data$X2>=2.393)*I( data$X1<266.9))
> data=cbind(data,R1,R2,R3,R4)
但想自动执行此过程。
非常感谢。
我们可以使用 eval(parse
res <- do.call(cbind, lapply(a, function(x) sapply(x,
function(y) with(data, +eval(parse(text=y))))))
如果我们需要专门针对 a[[3]]
res1 <- do.call(cbind, lapply(a[[3]], function(x) with(data, +eval(parse(text=x)))))
更新
如果我们假设 list
个元素有一个以上的字符串应该有 &
条件,那么
a1 <- lapply(a, paste, collapse=" & ")
res <- do.call(cbind, lapply(a1, function(x) sapply(x,
function(y) with(data, +eval(parse(text=y))))))
unname(colSums(res))
#[1] 25 7 14 11
数据
a <- list("X2>=2.393", "X2< 2.393", c("X2>=2.393", "X1>=266.9"),
c( "X2>=2.393", "X1< 266.9"))
我有一些数据
data
Y X1 X2
1 21.0 160.0 2.620
2 21.0 160.0 2.875
3 22.8 108.0 2.320
4 21.4 258.0 3.215
5 18.7 360.0 3.440
6 18.1 225.0 3.460
7 14.3 360.0 3.570
8 24.4 146.7 3.190
9 22.8 140.8 3.150
10 19.2 167.6 3.440
11 17.8 167.6 3.440
12 16.4 275.8 4.070
13 17.3 275.8 3.730
14 15.2 275.8 3.780
15 10.4 472.0 5.250
16 10.4 460.0 5.424
17 14.7 440.0 5.345
18 32.4 78.7 2.200
19 30.4 75.7 1.615
20 33.9 71.1 1.835
21 21.5 120.1 2.465
22 15.5 318.0 3.520
23 15.2 304.0 3.435
24 13.3 350.0 3.840
25 19.2 400.0 3.845
26 27.3 79.0 1.935
27 26.0 120.3 2.140
28 30.4 95.1 1.513
29 15.8 351.0 3.170
30 19.7 145.0 2.770
31 15.0 301.0 3.570
32 21.4 121.0 2.780
和条件列表:
a
[[1]]
[1] "X2>=2.393"
[[2]]
[1] "X2< 2.393"
[[3]]
[1] "X2>=2.393" "X1>=266.9"
[[4]]
[1] "X2>=2.393" "X1< 266.9"
我如何根据这些条件在我的数据中创建新的虚拟变量,而不是每次数据 $X2>=2.393 等都手动写入?如何将字符串中的条件与数据框合并?
我的解决方案是:
> R1<-as.numeric(I( data$X2>=2.393))
> R2<-as.numeric(I( data$X2< 2.393))
> R3<-as.numeric(I( data$X2>=2.393)*I( data$X1>=266.9))
> R4<-as.numeric(I( data$X2>=2.393)*I( data$X1<266.9))
> data=cbind(data,R1,R2,R3,R4)
但想自动执行此过程。
非常感谢。
我们可以使用 eval(parse
res <- do.call(cbind, lapply(a, function(x) sapply(x,
function(y) with(data, +eval(parse(text=y))))))
如果我们需要专门针对 a[[3]]
res1 <- do.call(cbind, lapply(a[[3]], function(x) with(data, +eval(parse(text=x)))))
更新
如果我们假设 list
个元素有一个以上的字符串应该有 &
条件,那么
a1 <- lapply(a, paste, collapse=" & ")
res <- do.call(cbind, lapply(a1, function(x) sapply(x,
function(y) with(data, +eval(parse(text=y))))))
unname(colSums(res))
#[1] 25 7 14 11
数据
a <- list("X2>=2.393", "X2< 2.393", c("X2>=2.393", "X1>=266.9"),
c( "X2>=2.393", "X1< 266.9"))