3

2 つのベクトルのすべての要素に番号を付ける場合、ベクトル 1 はすべて奇数番号を取得し、ベクトル 2 はすべて偶数番号を取得します。ベクトルの長さが 10 であると仮定すると、これを行うことができます。

seq(1, 10, by=2)
[1] 1 3 5 7 9

seq(2, 11, by=2)
[1]  2  4  6  8 10

ただし、ベクトルに要素が 1 つしかない場合、問題が発生します。

 seq(2)
[1] 1 2

だから私は使用します:

seq_along(2)
[1] 1

しかし、私はby=で使用できませんseq_long()seq_alongの機能での信頼性を得るにはどうすればよいseq()ですか?


この例は物事をクリアするかもしれません。

2 つのリストがあるとします。

list1 <- list(4)
list2 <- list(4)

list1リストの要素に沿って偶数の名前を取得する必要があります。 list2リストの要素に沿って奇妙な名前を取得する必要があります。

リスト要素の長さはわかりません。

seq_along(list1[[1]]) # this will know to only give one name but I cant make it even

seq(list2[[1]]) # this know to give 1 name
#and
seq(2, list1[[1]], by=2) # this gives me even but too nay names
4

5 に答える 5

4

以下は、seq_along に「by」引数を追加する関数です。

seq_along_by = function(x, by=1L, from = 1L) (seq_along(x) - 1L) * by + from

そしていくつかのテストケース

> seq_along_by(integer(), 2L)
integer(0)
> seq_along_by(1, 2L)
[1] 1
> seq_along_by(1:4, 2L)
[1] 1 3 5 7
> seq_along_by(1:4, 2.2)
[1] 1.0 3.2 5.4 7.6
> seq_along_by(1:4, -2.2)
[1]  1.0 -1.2 -3.4 -5.6
于 2013-01-30T15:51:04.673 に答える
1

あなたが何をしようとしているのかわかりませんがsplit、ベクトル内の奇数要素と偶数要素が必要な場合は、それを行うことができます:

x <- 1:19
split(x,x%%2)
$`0`
[1]  2  4  6  8 10 12 14 16 18

$`1`
 [1]  1  3  5  7  9 11 13 15 17 19

奇数番号と偶数番号の要素を抽出するには、次のlapplyリストを使用seq_alongして要素番号を列挙します。

x <- rep(c("odd","even"),times=4)
lapply(split(seq_along(x),seq_along(x)%%2),function(y) "["(x,y))
$`0`
[1] "even" "even" "even" "even"

$`1`
[1] "odd" "odd" "odd" "odd"

もちろん、これは関数にすることができます:

split_oe <- function(x) lapply(split(seq_along(x),seq_along(x)%%2),function(y) "["(x,y))
split_oe(1:10)
$`0`
[1]  2  4  6  8 10

$`1`
[1] 1 3 5 7 9

> split_oe(2)
$`1`
[1] 2
于 2013-01-30T14:35:45.903 に答える
1

私が見つけた1つの方法は次のとおりです。

  y <- seq_along(1:20)
  y[y %% 2 == 0 ]
  [1]  2  4  6  8 10 12 14 16 18 20
  y[ !y %% 2 == 0 ]
  [1]  1  3  5  7  9 11 13 15 17 19    

しかし、これはベクトルが偶数の場合にのみ機能します。もっとうまくやれるに違いない。

于 2013-01-30T14:30:45.383 に答える
1

私の理解が正しければ、あなたが本当に望んでいるのは、「seq」関数を取得して、それぞれ奇数またはオーブン番号 1..max または 2..max のみを返すことです。次のように書きます。

seq(1, max, by=2) # Odd numbers
seq(2, max, by=2) # Even numbers

maxあなたのシリーズの一番上の数字はどこですか。これが壊れるのは、maxが 2 未満の場合だけです。

更新 1 : OP が何を要求しているかについて少し議論があるようです。番号を付ける既存のベクトルが 2 つあると仮定すると、 を使用してベクトル項目の総数max <- length(c(vector1, vector2))を取得し、使用されている最大数を取得できます。次に、インデックスは次のように割り当てられます。

vector1 <- seq(1, max, by=2)
vector2 <- seq(2, max, by=2)

そして、これは、1 つのベクトルに要素がまったくない場合を除いて、どのセットでも機能します。

更新 2 : ベクトルが 1 から までのすべての値を表していない場合に使用できる最後のアプローチが 1 つありますmax。これがどのように機能するかです:

vector1 <- seq(1, length(vector1) * 2, by=2)
vector2 <- seq(1, length(vector2) * 2, by=2)

これにより、vector1 と vector2 の値がそれぞれの長さに応じて個別に割り当てられます。

于 2013-01-30T14:31:10.953 に答える
1

あなたが述べた質問ではなく、質問の意図に対処するために別の回答を追加しています。

A1値を持ついくつかの配列 と がありA2、これらの値にインデックスをリンクすると仮定して、ifが奇数でifが偶数index[n]から対応する値を取得できるようにします。A1[n/2 + 1]nA2[n/2]n

index次のように、新しいベクトルを作成します。

# Sample arrays
A1 <- sample(LETTERS, 5, rep=TRUE)
A2 <- sample(LETTERS, 5, rep=TRUE)

n_Max <- length(c(A1,A2))
index <- integer(n_Max)
index[seq(1,n_Max,by=2)] <- A1
index[seq(2,n_Max,by=2)] <- A2

現在、が奇数の場合は値をindex[n]返し、 が偶数の場合は値を返します。これは、が と等しくないか 1 未満の場合に壊れます。A1nA2nlength(A2)length(A1)

于 2013-01-30T15:13:19.753 に答える