2017-01-24 5 views
2

n番目の値nとLの間の整数を表す不等なベクトルのリストを生成したい。2つの等しい長さのベクトルのn番目の値の間の整数を表すベクトルのリストを作成するR

> n 
[1] 1 2 3 4 5 6 7 

> L 
[1] 2 2 4 4 4 4 4 

Nの各値に対して、IはLとN N> Lの間の整数を連結、またはNの単一の値を取得するときL = N、または値で置換しますL> nのときは0となる。私は不等ベクトルのリスト(または他のエンティティ)を取得したい。理想的な出力:

i 
1 0 
2 2 
3 0 
4 4 
5 4 5 
6 4 5 6 
7 4 5 6 7 

私はコロン演算子(後で負の値を置き換えるつもりで)を使用しようとしました。

c((L):n) 

しかし、それはエラーが付属しています:

numerical expression has 205 elements: only the first used 

答えて

1

我々はvector

sapply(Map(f1, n, L), paste, collapse=" ") 
#[1] "1 0"  "2 2"  "3 0"  "4 4"  "5 4 5"  "6 4 5 6" "7 4 5 6 7" 

が必要な場合我々は Map

f1 <- function(x,y) c(x, if(x < y) 0 else if(x == y) x else y:x) 
Map(f1, n, L) 
#[[1]] 
#[1] 1 0 

#[[2]] 
#[1] 2 2 

#[[3]] 
#[1] 3 0 

#[[4]] 
#[1] 4 4 

#[[5]] 
#[1] 5 4 5 

#[[6]] 
#[1] 6 4 5 6 

#[[7]] 
#[1] 7 4 5 6 7 

を使用することができます

それともただ

for(i in seq_along(n)) 
cat(c(n[i], if(n[i] < L[i]) 0 else if(n[i] == L[i]) n[i] else L[i]:n[i]), "\n") 
#1 0 
#2 2 
#3 0 
#4 4 
#5 4 5 
#6 4 5 6 
#7 4 5 6 7 
+0

としてベクトルを与え、accumulate = TRUE引数でReduceを用いた方法は、リストを作成しますが、値は以下のようにまとめられているにそれを印刷したい場合キャラクター。スペース上で 'strsplit'関数を使用して、別々の数字のリストを取得しました。 '' 88 89 90 ''の代わりに '' 88 "" 89 "" 90 "'を使うことができますが、式で使う数値を強制することはできません。 –

+0

@ M.Day私はあなたが値をどのようにしたいのか分からなかった。しかし 'Map(f1、n、L)'は、あなたの下流の計算に簡単に使用できる '数値'ベクトルのリストを返します。 – akrun

+1

ああ、確かに抽出されます。ありがとう@akrun。とても有難い。 –

1

`sapply`を使用した結果

v1 <- ifelse(L > n, 0, ifelse(n == L, L, -1)) 
v1[v1 == -1] <- unique(unlist(Reduce(paste, x[v1==-1], y[v1==-1], accumulate = TRUE)))[-1] 
#[1] "0"  "2"  "0"  "4"  "4 5"  "4 5 6" "4 5 6 7" 
関連する問題