3

比方说,我有一个table用标题命名的表,看起来像

A B
1 2
2 1

我想要做的是添加一个新列table$C,这样

  1. 如果table$A < table$B那么table$C <- (table$B-table$A)/table$A
  2. 如果table$A > table$B那么table$C <- (table$B-table$A)/table$B

对于每一行,以便生成的表看起来像

A B C
1 2 1
2 1 -1

我尝试过,很天真,
> table$C <- if (table$A < table$B) (table$B-table$A)/table$A else (table$B-table$A)/\table$B

> table$C <- ifelse(table$A < table$B, (table$B-table$A)/table$A, (table$B-table$A)/table$B)
他们都没有工作。我该怎么做?

4

3 回答 3

4

像往常一样,有很多方法可以做到这一点。假设您的规则保持不变并且您从来没有被零除的情况,这里有一些想法......

df <- data.frame(A = c(1, 2), B = c(2, 1))

# Making use of pmin.
df$c <- (df$B - df$A) / pmin(df$A, df$B)

# Making use of 'with' ( See ?with )
df$C <- with(df, (B - A)/pmin(A, B))

# Making use of data.table.
library(data.table, quiet = TRUE)

## data.table 1.8.2 For help type: help("data.table")

dt <- data.table(df)

dt[, `:=`(C, (B - A)/pmin(A, B))]

##    A B  C
## 1: 1 2  1
## 2: 2 1 -1
于 2012-09-01T04:53:21.630 回答
2

正如您所指出的,您的第二种方法(没有原始拼写错误)是正确的,但我认为这更快、更容易阅读且不易出错:

table$C <- with(table, ifelse(A < B, (B - A)/A, (B - A)/B))
于 2012-09-01T01:57:28.220 回答
0

使用逻辑索引:

table$C <- (table$B-table$A)/((table$A<=table$B)*table$A+(table$A>table$B)*table$B)
于 2012-08-31T23:40:30.207 回答