为什么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新手。阅读代码几乎会带来伤害。