次のようなデータフレームがあります
data.1 <- data.frame(
X1 = 6:10,
X2 = 1:5,
X3 = c(TRUE,FALSE,TRUE,FALSE,TRUE)
)
X1 X2 X3
1 6 1 TRUE
2 7 2 FALSE
3 8 3 TRUE
4 9 4 FALSE
5 10 5 TRUE
次のロジックで新しい列X4を作成したいと思います。
if X3==NULL then X4=NULL
elseif X3==TRUE then X4=X1+X2
else X4=X1-X2
前もって感謝します
lapply
あなたのデータがリストであるときのためのものであり、それはあなたがしていることではありません。
まず、にNULL
エントリが見つかりませんdata.frame
。NA
、確かに、しかしそうではないNULL
ので、あなたは回避する必要がありis.na()
ます。次に、テストする必要はありませんif(x==TRUE)
。Rはの使い方を知っていますif(x)
。さて、ビジネスに移りましょう。あなたはあなたと一緒にそこにほとんどの道を歩んでいましたifelse
。の出力にベクトルを割り当てることができ、ベクトルifelse
化が自動的に処理されます。
data.1$X4 <- ifelse(is.na(data.1$X3),
NA,
ifelse(data.1$X3==TRUE,
data.1$X1+data.1$X2,
data.1$X1-data.1$X2))
data.1
## X1 X2 X3 X4
## 1 6 1 TRUE 7
## 2 7 2 FALSE 5
## 3 8 3 TRUE 11
## 4 9 4 FALSE 5
## 5 10 5 TRUE 15
しかし、それは醜いです。dplyr
名前空間で列を検索する非標準の評価が含まれているため、列を参照するたびにデータ名を引用する必要がなく、これがはるかにクリーンになります。dplyr::mutate
列を変更します。
library(dplyr)
mutate(data.1, X4 = ifelse(is.na(X3),
NA,
ifelse(X3,
X1+X2,
X1-X2)))
data.1
## X1 X2 X3 X4
## 1 6 1 TRUE 7
## 2 7 2 FALSE 5
## 3 8 3 TRUE 11
## 4 9 4 FALSE 5
## 5 10 5 TRUE 15
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加