Rには、負の数と正の数の両方で構成される数値ベクトルがあります。符号に基づいてリスト内の数値を(今のところゼロを無視して)2つの別々のリストに分けたいと思います。
- 負の数のみを含む新しいベクトル
- 正の数のみを含む別のベクトル
ドキュメントは、データフレーム内の行/列/セルを選択するためにこれを行う方法を示していますが、これはベクトルAFAICTでは機能しません。
どうすれば(forループなしで)実行できますか?
Rには、負の数と正の数の両方で構成される数値ベクトルがあります。符号に基づいてリスト内の数値を(今のところゼロを無視して)2つの別々のリストに分けたいと思います。
ドキュメントは、データフレーム内の行/列/セルを選択するためにこれを行う方法を示していますが、これはベクトルAFAICTでは機能しません。
どうすれば(forループなしで)実行できますか?
これは非常に簡単に実行できます(NaNのチェックを追加):
d <- c(1, -1, 3, -2, 0, NaN)
positives <- d[d>0 & !is.nan(d)]
negatives <- d[d<0 & !is.nan(d)]
NAとNaNの両方を除外する場合、is.na()は両方に対してtrueを返します。
d <- c(1, -1, 3, -2, 0, NaN, NA)
positives <- d[d>0 & !is.na(d)]
negatives <- d[d<0 & !is.na(d)]
「角かっこ」を使用して実行できます。ゼロより大きい値を含む新しいベクトルが作成されます。比較演算子が使用されているため、ブール値で値を示します。したがって、角かっこは正確な数値を取得するために使用されます。
d_vector<-(1,2,3,-1,-2,-3)
new_vector<-d_vector>0
pos_vector<-d_vector[new_vector]
new1_vector<-d_vector<0
neg_vector<-d_vector[new1_vector]
purrr
パッケージには、ベクトルをフィルタリングするためのいくつかの便利な関数が含まれています。
library(purrr)
test_vector <- c(-5, 7, 0, 5, -8, 12, 1, 2, 3, -1, -2, -3, NA, Inf, -Inf, NaN)
positive_vector <- keep(test_vector, function(x) x > 0)
positive_vector
# [1] 7 5 12 1 2 3 Inf
negative_vector <- keep(test_vector, function(x) x < 0)
negative_vector
# [1] -5 -8 -1 -2 -3 -Inf
discard
機能も使用できます