0

私は次のように呼ぶデータセットを持っていますsam.data:

dput(sam.data)
structure(list(idn = c(1L, 2L, 3L, 4L, 5L, 6L, 66L, 62L, 7L, 
81L, 68L, 72L), n1 = c(1L, 2L, 3L, 4L, 5L, 6L, 6L, 6L, 7L, 7L, 
7L, 7L), x = c(9.95228, 11.4186, 10.3735, 10.5453, 10.7364, 9.85219, 
9.73307, 9.86304, 9.74097, 9.57359, 9.70899, 9.75185)), .Names = c("idn", 
"n1", "x"), row.names = c(NA, 12L), class = "data.frame")

sam.data

    idn n1     x
1    1  1  9.95228
2    2  2 11.41860
3    3  3 10.37350
4    4  4 10.54530
5    5  5 10.73640
6    6  6  9.85219
7   66  6  9.73307
8   62  6  9.86304
9    7  7  9.74097
10  81  7  9.57359
11  68  7  9.70899
12  72  7  9.75185

idnと等しくない場合、に対応するの値を取るn1新しい変数 を作成したいと思います。yxn1

予想される出力は次のようになります。

   idn n1        x        y
1    1  1  9.95228  
2    2  2 11.41860 
3    3  3 10.37350 
4    4  4 10.54530 
5    5  5 10.73640 
6    6  6  9.85219 
7   66  6  9.73307  9.85219
8   62  6  9.86304  9.85219
9    7  7  9.74097 
10  81  7  9.57359  9.74097
11  68  7  9.70899  9.74097
12  72  7  9.75185  9.74097

Rで近い解決策を生成することができました:

library(plyr)
sam.data2<-ddply(sam.data,.(n1),transform, y=x[which.min(idn)])
sam.data2
 sam.data2
   idn n1        x        y
1    1  1  9.95228  9.95228
2    2  2 11.41860 11.41860
3    3  3 10.37350 10.37350
4    4  4 10.54530 10.54530
5    5  5 10.73640 10.73640
6    6  6  9.85219  9.85219
7   66  6  9.73307  9.85219
8   62  6  9.86304  9.85219
9    7  7  9.74097  9.74097
10  81  7  9.57359  9.74097
11  68  7  9.70899  9.74097
12  72  7  9.75185  9.74097

ただし、よりエレガントなソリューションが必要です。

Stataでの解決策も探しています。

4

5 に答える 5

3

by 基本パッケージから使用する別のオプション。

dat$y <- unlist(by(dat,dat$n1,  FUN=    
      function(x){
        res <- ifelse(x$idn==x$n1,
               NA,
               x$x[which.min(x$idn)])
        }))

ここで、文字列である `` ではなく NA (数値) を使用しているため、結果は目的の出力とはわずかに異なることに注意してください。

  idn n1        x       y
1    1  1  9.95228      NA
2    2  2 11.41860      NA
3    3  3 10.37350      NA
4    4  4 10.54530      NA
5    5  5 10.73640      NA
6    6  6  9.85219      NA
7   66  6  9.73307 9.85219
8   62  6  9.86304 9.85219
9    7  7  9.74097      NA
10  81  7  9.57359 9.74097
11  68  7  9.70899 9.74097
12  72  7  9.75185 9.74097
于 2013-03-31T17:40:46.040 に答える
3

これが何のために必要なのかわかりませんが、単に出力を使用して、x が y に等しい場所を確認し、それを次のように置き換えることで、目的の出力のように見せることができます""

sam.data2$y[sam.data2$x == sam.data2$y] <- ""
sam.data2

## > sam.data2
##    idn n1        x       y
## 1    1  1  9.95228        
## 2    2  2 11.41860        
## 3    3  3 10.37350        
## 4    4  4 10.54530        
## 5    5  5 10.73640        
## 6    6  6  9.85219        
## 7   66  6  9.73307 9.85219
## 8   62  6  9.86304 9.85219
## 9    7  7  9.74097        
## 10  81  7  9.57359 9.74097
## 11  68  7  9.70899 9.74097
## 12  72  7  9.75185 9.74097

これにはいくつかのアプローチがあり、これを何に使用するかによって、どのアプローチを取るかによって異なります。純粋に美学のためであれば、上記は非常に簡単ですが、列は文字であり、数値ではありません。

于 2013-03-31T17:27:10.803 に答える
1

Stataコードは

sort n1, stable
by n1: gen y2 = x[1] if idn != n1

(これは改訂された提案です。)

于 2013-04-01T17:21:21.290 に答える