0

stata私は私が変換しようとしている次のコードを持っていますR

dataframe

    y1  y2  y3  y4  y5  y6  y11 y12 y13 y14 y15 y16
    5   0   0   0   0   0   0   0   0   0   0   0
    5   0   0   0   0   0   0   0   0   0   0   0
    5   0   0   0   0   0   0   0   0   0   0   0
    5   0   0   0   0   0   0   0   0   0   0   0
    5   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   1   2   1   2   0   0
    0   0   0   0   0   0   1   1   1   2   0   0
    0   0   0   0   0   0   1   8   1   2   0   0
    0   0   0   0   0   0   1   1   1   2   0   0
    0   0   0   0   0   0   1   1   1   2   0   0
    1   1   0   0   0   0   0   0   0   0   0   0
    1   1   0   0   0   0   0   0   0   0   0   0
    1   1   0   0   0   0   0   0   0   0   0   0
    1   1   0   0   0   0   0   0   0   0   0   0
    2   2   5   1   1   2   2   2   1   1   2       1

local z1 "y1 y12 y3 y4 y5 y6"
local z2 "y11 y12 y13 y14 y15 y16"
local i = 1
local n : word count `z1'
gen k=.

while `i'<=`n' {

    local z1`i' : word `i' of `z1'
        local z2`i' : word `i' of `z2'
        replace k=max(0,`z1`i'')*(`z2`i''==2|`z2`i''==1)
        local i=`i'+1
    } 

期待される出力:

k
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
2

次の同等のRコードを使用しました。

      dataframe$z1<- "y1 y12 y3 y4 y5 y6"
      dataframe$z2<- "y11 y12 y13 y14 y15 y16"
      i<-  1
      n<-sapply(gregexpr("\\W+", z1), length) + 1
      dataframe$k<-NA

    for (j in i:n){
  .... #I wanted to refer to each word of z1 
  ...#e.g.,dataframe$z1[i]<-which gives word i of z1 
  .. #I wanted to refer to each word of z2
  ... #e.g.,dataframe$z1[i]<-whicg gives word i of z2 

   dataframe$k<-with(dataframe, pmax(0,z1[j])*ifelse(z2[j] %in% c(1,2),1,0))

}

点線は、で同等のコードを見つけることができなかったことを示していますR。この点で私を助けていただければ幸いです。

    # Updated Stata codes and data (number of observation is reduced to 10)

y1  y2  y3  y4  y5  y6  y11 y12 y13 y14 y15 y16
5   0   0   0   0   0   0   0   0   0   0   0
5   0   0   0   0   0   0   0   0   0   0   0
5   0   0   0   0   0   0   0   0   0   0   0
5   0   0   0   0   0   0   0   0   0   0   0
5   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0

y111    y112    y113    y114    y115    y116    y1111   y1112   y1113   y1114   y1115   y1116
1   0   0   0   0   0   81000   0   0   0   0   0
1   0   0   0   0   0   86000   0   0   0   0   0
1   0   0   0   0   0   96000   0   0   0   0   0
1   0   0   0   0   0   84000   0   0   0   0   0
1   0   0   0   0   0   76000   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0   0

    local z1 "y1 y2 y3 y4 y5 y6"
    local z2 "y11 y12 y13 y14 y15 y16"
    local z3 "y111 y112 y113 y114 y115 y116"
    local z4 "y1111 y1112 y1113 y1114 y1115 y1116"
    local i = 1
    local n : word count `z1'
    gen k=.
    gen r=0
    gen s=0
    gen t=0
    while `i'<=`n' {

        local z1`i' : word `i' of `z1'
            local z2`i' : word `i' of `z2'
            local z3`i' : word `i' of `z3'
            local z4`i' : word `i' of `z4'


            replace k=max(0,`z4`i'')*(`z1`i''==5|`z1`i''==10|`z2`i''==2|`z2`i''==1|`z3`i''==1)
            replace r=r+k if `i'<=3
            replace s=s+k if `i'>3
            replace t=t+k
            local i=`i'+1
        } 

#Expected output

t       r   s       k
81000   81000   0   0
86000   86000   0   0
96000   96000   0   0
84000   84000   0   0
76000   76000   0   0
0           0   0   0
0           0   0   0
0           0   0   0
0           0   0   0
0           0   0   0
4

4 に答える 4

2

Stataコードはほとんど意味がありません。与えられたデータを使用して、コードは変数y1、...、y6および変数y11、 ...、をループしていますy16。最初は新しい変数kが欠落しているように設定されますが、前の変数に何が当てはまるかに関係なく、結果は次のようになります。

max(0, y6) * (y16 == 2|y16 == 1)

これは、提示されたほとんどのコードよりもRユーザーに対して透過的である必要があります。この関数max()は、大きい方の引数を返し、行方向に動作します。

それが意図されていることではないかと思いますが、意図されていることを推測しようとはしません。

于 2013-01-21T10:08:12.443 に答える
2

maxNickは、あなたの呼び出しが前のを参照していないという良い点を指摘しているkので、6番目の列のチェックに折りたたまれます。行を最大にしたい場合は、これがRに相当します。最初にデータをtxtファイルに保存しました。

data_all <- read.table("data.txt", header=T)
data_one <- data_all[,1:6]
data_two <- data_all[,7:12]
my_fun_one <- function(x, y) {
  x * ((y == 1) | (y == 2))
}
data_three <- mapply(FUN = my_fun_one, x=data_one, y=data_two)
my_fun_two <- function(x) {
  max(x, 0)
}
k <- apply(data_three, 1, FUN = my_fun_two)

これにより、

> k
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5

更新-更新された完全な問題の解決策は次のとおりです。それは、多かれ少なかれ、同じビルディングブロックを使用します。Rの基本に慣れたら、、、、およびを最大限に活用できるとapply思いlapplyますmapply

data_one <- read.table("data_one.txt", header=T)
data_two <- read.table("data_two.txt", header=T)
z1 <- data_one[, 1:6]
z2 <- data_one[, 7:12]
z3 <- data_two[, 1:6]
z4 <- data_two[, 7:12]
my_fun <- function(w, x, y, z) {
  z * (z > 0) * ((w %in% c(5, 10)) | (x %in% c(1, 2)) | (y == 1))
}
z5 <- mapply(FUN=my_fun, w=z1, x=z2, y=z3, z=z4)
r <- rowSums(z5[, 1:3]) 
s <- rowSums(z5[, 4:6]) 
t <- rowSums(z5)
k <- z5[, ncol(z5)]
data_three <- data.frame(t, r, s, k)

これにより、次のようになります。

> data_three
       t     r s k
1  81000 81000 0 0
2  86000 86000 0 0
3  96000 96000 0 0
4  84000 84000 0 0
5  76000 76000 0 0
6      0     0 0 0
7      0     0 0 0
8      0     0 0 0
9      0     0 0 0
10     0     0 0 0
于 2013-01-21T10:18:39.420 に答える
2

これは、元のStataコードの短いバージョンです。与えられたStata変数(列、ベクトル)y1...y6およびy11...を取りますy16

gen k = .

forval i = 1/6 {
    replace k = max(0, y`i') * (y1`i' == 2|y1`i' == 1)
} 

ループはforval1、2、3、4、5、6を循環します。マクロ置換があるため、最初にRHSがループをmax(0, y1) * (y11 == 2|y11 == 1)一周し、最後にRHSがループを一周しますmax(0, y6) * (y16 == 2|y16 == 1)。したがって、ループから出てくる結果は、必然的に最後の計算の結果になります。

local(編集)ステートメントが不要であることを確認します。

(2回目の編集)またy12、オリジナルlocal z1 "y1 y12 y3 y4 y5 y6"ではのタイプミスだったと思いますy2

于 2013-01-21T16:14:52.353 に答える
1

すでに通知されているように、Stataコードは次のように簡略化できます。

gen k = .
gen r = 0
gen s = 0
gen t = 0
quietly forval i = 1/6 {
replace k = max(0, y111`i')*(y`i'==5|y`i'==10|y1`i'==2|y1`i'==1|y11`i'==1)
     replace r = r+k if `i'<=3
     replace s = s+k if `i'>3
     replace t = t+k
} 

k改訂されたコードは、の新しい結果kが常に迅速に使用されるため、上書きが問題にならない理由を明確にしています。

于 2013-01-21T19:46:02.890 に答える