为什么R中的with()在一种情况下执行向量运算,而在另一种情况下不执行向量运算?

为什么R中的with()在一种情况下执行向量运算,而在另一种情况下不执行向量运算?,r,with-statement,if-statement,R,With Statement,If Statement,我有下表: > head(datalist[[5]]) X5CO X5CS X5CD X5CSD 1 24.87769 24.31233 26.84647 34.3316 2 24.74026 24.31233 26.84647 34.3316 3 24.45217 24.31233 26.84647 34.3316 10 24.87769 24.31233 26.15139 34.3316 11 24.74026 24.31233 26.15139

我有下表:

> head(datalist[[5]])
       X5CO     X5CS     X5CD   X5CSD
1  24.87769 24.31233 26.84647 34.3316
2  24.74026 24.31233 26.84647 34.3316
3  24.45217 24.31233 26.84647 34.3316
10 24.87769 24.31233 26.15139 34.3316
11 24.74026 24.31233 26.15139 34.3316
12 24.45217 24.31233 26.15139 34.3316
我需要使用每一行作为变量值应用以下表达式。所以我使用with()函数。这在2个嵌套的ifelse中运行良好,但是当我添加第三个ifelse()时,它就不再工作了。亲自看看:

> with( head(datalist[[5]]),{
+   cCO=get(paste("X", 5,"CO",sep=""))
+   cCS=get(paste("X", 5,"CS",sep=""))
+   cCD=get(paste("X", 5,"CD",sep=""))
+   cCSD=get(paste("X", 5,"CSD",sep=""))
+           ifelse( (cCS-cCO) > 0, 1,  #1st consequent
+                   ifelse ( (cCD-cCO) > 0, 2, # 2nd
+                            5) ) } )  # default
[1] 2 2 2 2 2 2
只有两个嵌套循环,结果是[1]2,这就是我想要的。但是,当我添加第三个条件时,它不再起作用:

> with( head(datalist[[5]]),{
+   cCO=get(paste("X", 5,"CO",sep=""))
+   cCS=get(paste("X", 5,"CS",sep=""))
+   cCD=get(paste("X", 5,"CD",sep=""))
+   cCSD=get(paste("X", 5,"CSD",sep=""))
+       ifelse( (cCS-cCO)>0 && (cCD-cCO) > 0, 3, #1st consequent
+         ifelse( (cCS-cCO) > 0, 1,  #2nd consequent
+           ifelse ( (cCD-cCO) > 0, 2, # 3rd
+                        5) ) ) } )  # default
[1] 2

为什么要这样做?

这里有一些更好的代码:

DF <- read.table(text="X5CO     X5CS     X5CD   X5CSD
1  24.87769 24.31233 26.84647 34.3316
2  24.74026 24.31233 26.84647 34.3316
3  24.45217 24.31233 26.84647 34.3316
10 24.87769 24.31233 26.15139 34.3316
11 24.74026 24.31233 26.15139 34.3316
12 24.45217 24.31233 26.15139 34.3316",header=TRUE)

#clean-up column names
names(DF) <- gsub("X5","c",names(DF))

#logicals get converted to numerics, when doing calculations with them
with(DF,(cCO<cCS) + (cCO<cCD)*2 + (cCO>=cCS & cCO>=cCD)*5)
#[1] 2 2 2 2 2 2

DF以下是一些更好的代码:

DF <- read.table(text="X5CO     X5CS     X5CD   X5CSD
1  24.87769 24.31233 26.84647 34.3316
2  24.74026 24.31233 26.84647 34.3316
3  24.45217 24.31233 26.84647 34.3316
10 24.87769 24.31233 26.15139 34.3316
11 24.74026 24.31233 26.15139 34.3316
12 24.45217 24.31233 26.15139 34.3316",header=TRUE)

#clean-up column names
names(DF) <- gsub("X5","c",names(DF))

#logicals get converted to numerics, when doing calculations with them
with(DF,(cCO<cCS) + (cCO<cCD)*2 + (cCO>=cCS & cCO>=cCD)*5)
#[1] 2 2 2 2 2 2

DF当您在第一个
ifelse
语句中使用
&
而不是
&
时,会有什么不同吗?很高兴它帮助了您!关于
&
&
之间的区别,请看一看,很明显,您的背景是另一种语言,而且您是R语言新手。阅读您的代码几乎是痛苦的。当您在第一个
ifelse
语句中使用
&
而不是
&
时,这会有所不同吗?很高兴它对您有所帮助!关于
&
&&
之间的区别,请看一看,很明显,您的背景是另一种语言,而且您是R新手。阅读代码几乎会带来伤害。