假设我有一个名为table
的表格,其标题看起来像
A B
1 2
2 1
我想要做的是添加一个新列table$C
,以便
table$A < table$B
则table$C <- (table$B-table$A)/table$A
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)
但他们俩都没有用。我该怎么做?
答案 0 :(得分: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
答案 1 :(得分:2)
您的第二种方法(没有原始拼写错误)是正确的,正如您所说,但我认为这更快,更容易阅读并且更不容易出错:
table$C <- with(table, ifelse(A < B, (B - A)/A, (B - A)/B))
答案 2 :(得分:0)
使用逻辑索引:
table$C <- (table$B-table$A)/((table$A<=table$B)*table$A+(table$A>table$B)*table$B)