【发布时间】:2016-03-19 21:09:02
【问题描述】:
我实际上在处理我的代码的特定任务时遇到了问题。我有一个数据框
n <- 6
set.seed(123)
df <- data.frame(x=paste0("x",seq_along(1:n)), A=sample(c(-2:2),n,replace=TRUE), B=sample(c(-1:3),n,replace=TRUE))
#
# x A B
# 1 x1 -1 1
# 2 x2 1 3
# 3 x3 0 1
# 4 x4 2 1
# 5 x5 2 3
# 6 x6 -2 1
决策树为
A>0;Y;Y;N;N
B>1;Y;N;Y;N
C;1;2;2;1
我加载的
dt <- read.csv2("tmp.csv", header=FALSE)
我想为 (A>0) 和 (B>1) 的所有可能组合创建一个循环,并将 C 值设置为满足该条件的子集 x 列。所以,这就是我所做的
nr <- 3
nc <- 5
cond <- dt[1:(nr-1),1,drop=FALSE]
rule <- dt[nr,1,drop=FALSE]
subdf <- vector(mode="list",2^(nr-1))
for (i in 2:nc) {
check <- paste0("")
for (j in 1:(nr-1)) {
case <- paste0(dt[j,1])
if (dt[j,i]=="N")
case <- paste0("!",case)
check <- paste0(check, "(", case, ")" )
if (j<(nr-1))
check <- paste0(check, "&")
}
subdf[i] <- subset(df,check)
subdf[i]$C <- dt[nr,i]
}
unlist(subdf)
不幸的是,我在使用子集时遇到了一个错误,因为它无法解析我的字符串语句中的条件。我该怎么办?
【问题讨论】:
-
问题会比这个大,还是只检查a和b?
-
是的,问题比这还大,但我想简化它并推广给其他人。有错吗?
-
我只是在检查。你完全没有错(你是对的),所以一个解决方案应该可以推广到任意数量的规则。
-
最大的问题是子集步骤。添加更多规则只会在 subdf[i] 中添加其他列
标签: r if-statement dataframe subset