【问题标题】:Why with() in R is doing vector operation in one case and not in the other? [duplicate]为什么 R 中的 with() 在一种情况下进行向量运算,而不是在另一种情况下? [复制]
【发布时间】:2013-06-19 14:26:24
【问题描述】:

我有下表:

> 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

只有 2 个嵌套循环,结果是 [1] 2 2 2 2 2 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

为什么要这样做?

【问题讨论】:

  • 在第一个ifelse 语句中使用& 而不是&& 有区别吗?
  • 很高兴它帮助了你!
  • &&&的区别见here
  • 很明显,你的背景是另一种语言,而且你是 R 新手。阅读你的代码几乎是痛苦的。

标签: r with-statement if-statement


【解决方案1】:

这里有一些更好的代码:

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

【讨论】:

    猜你喜欢
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2022-12-01
    • 1970-01-01
    相关资源
    最近更新 更多