0

私は2つのベクトルを持っています

 x<-c(1,1,1,2,2,2,3,3,4,5,5,6)
 y<-c("a","b","c","d","e","f","g","h","i","j","k","l")

x の一連の等しい値の最初の要素と一致する y のみを選択したいので、私の場合、最終的な解決策は次のようになります。

    y x
 1  a 1
 4  d 2
 7  g 3
 9  i 4
 10 j 5
 12 l 6

私たちはスクリプトを書き、それは機能しますが、追加の行を追加および削除する必要があります (後で cbind を使用するため)。

aaa<-data.frame(y,x)
df<-NULL
for (i in 2:length(aaa$x)){   # you may see it stars from the second element because 
                               # of x[i-1]
   bbb<-ifelse((aaa$x[i]!= aaa$x[i-1]), aaa$x[i], NA)
     df<-rbind(df,bbb)
}
df
df<-rbind(1,df)
aaa$x<-df[,1]
bbb<-na.omit(aaa)
bbb

以前に推奨された rle() を適用しようとしました中断されない番号のみを選択するにはどうすればよいですか? しかし、この場合は失敗しました。

あなたの推薦を聞きたいです、

ありがとうございました。

4

2 に答える 2

3

簡単な解決策は次のとおりです。

aaa <- data.frame(y, x)
aaa[!duplicated(aaa$x), ]

#    y x
# 1  a 1
# 4  d 2
# 7  g 3
# 9  i 4
# 10 j 5
# 12 l 6
于 2012-10-26T13:44:25.903 に答える
1

多分このようなもの:

justFirst <- function(x, y){
    stopifnot(length(x) > 1 && length(y) > 1 && length(x) == length(y))
    newX <- newY <- vector()
    for (i in 1:length(x)){
        if (i == 1){
            newX <- c(newX, x[i])
            newY <- c(newY, y[i])
        }
        else{
            if (x[i] != x[i-1]){
                newX <- c(newX, x[i])
                newY <- c(newY, y[i])
            }
        }
    }
    return(data.frame(newX, newY))
}

x<-c(1,1,1,2,2,2,3,3,4,5,5,6)
y<-c("a","b","c","d","e","f","g","h","i","j","k","l")

justFirst(x, y)

x と y が次のように見える状況 (順不同で乱雑) がある場合に備えて、代わりにこれをここに入れます。

x<-c(1,1,1,2,1,2,3,3,4,5,5,6,7,4,4,4,4,3,2,3)
y<-c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t")

しかし、この状況を処理するためのより良い方法がまだあるかもしれません...

于 2012-10-26T13:57:41.227 に答える