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

お気づきのように、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 に答える