-1

目的

指定されたデータから、オブジェクトで指定された調和規則に従って、新しい変数をds計算します。ds$h1ds$raw1ds$raw2hrule

再現可能な例には、2 つの測定に対する 10 人の個人の応答が含まれていraw1ますraw2

>ds
   id raw1 raw2
1   1    1    1
2   2    1    0
3   3    0    1
4   4    0    0
5   5   NA    1
6   6   NA    0
7   7    1   NA
8   8    0   NA
9   9   NA   NA
10 10    1    1

これらの 2 つの変数は、(定性的に開発された) 何らかの規則に従って、単一の調和した変数に変換する必要があります。調和変換の規則は、オブジェクトにエンコードされていますhrule

>hrule
  raw1 raw2  h1
1    0    0   0
2    0    1   1
3    0   NA   0
4    1    0   1
5    1    1   1
6    1   NA   1
7   NA    0   0
8   NA    1   1
9   NA   NA   NA

したがって、ルールは行 1 に対して次のように読み取られる必要があります。

回答者が on の値と on の値を提供した場合、の値0はになります。raw10raw2h10

機能目標

、 、変数名を文字ベクトル( )、調和変数名( )に渡しds、新しい調和変数( )を出力する関数を作成します。hrulec("raw1","raw2")"h1"ds$h1

スターター コード

(ds <- data.frame("id" = 1:10,
                  "raw1" = c(1,1,0,0,NA,NA,1 ,0 ,NA,1),
                  "raw2" = c(1,0,1,0,1 ,0 ,NA,NA,NA,1)))
(response_profile <- ds %>% dplyr::group_by(raw1, raw2) %>% dplyr::summarize(count=n()))
(hrule <- cbind(response_profile, "h1" = c(0,1,0,1,1,1,0,1,NA)))
new_function <- function(ds, hrule,
                         variable_names, # variable_names = c("raw1,"raw2"), the number will vary
                         harmony_name # harmony_name = "h1", there might be "h2"
){

}

あなたのアイデアを前もってありがとう!

4

1 に答える 1

0

@Symbolixによって提案された完全なソリューションは次のとおりです

rm(list=ls(all=TRUE)) #Clear the memory of variables from previous run. This is not called by knitr, because it's above the first chunk.
cat("\f")
library(magrittr)

(ds <- data.frame("id" = 1:10,
                  "raw1" = c(1,1,0,0,NA,NA,1 ,0 ,NA,1),
                  "raw2" = c(1,0,1,0,1 ,0 ,NA,NA,NA,1)))
response_profile <- ds %>% dplyr::group_by(raw1, raw2) %>% dplyr::summarize(count=n()) %>% dplyr::select(-count)
(hrule <- cbind(response_profile, 
                "h1" = c(0,1,0 ,1,1,1 ,0 ,1 ,NA), # at least one 1 to produce 1
                "h2"=  c(0,0,NA,0,1,NA,NA,NA,NA) # both must be 1
                )) 
recode_from_meta <- function(ds, hrule, variable_names, harmony_name){
d <- merge(ds, hrule[, c(variable_names, harmony_name)], by=variable_names, all.x=T)
}

> hrule
  raw1 raw2 h1 h2
1    0    0  0  0
2    0    1  1  0
3    0   NA  0 NA
4    1    0  1  0
5    1    1  1  1
6    1   NA  1 NA
7   NA    0  0 NA
8   NA    1  1 NA
9   NA   NA NA NA


> (d <- recode_from_meta(ds, hrule,variable_names=c("raw1", "raw2"), harmony_name="h1"))
   raw1 raw2 id h1
1     0    0  4  0
2     0    1  3  1
3     0   NA  8  0
4     1    0  2  1
5     1    1  1  1
6     1    1 10  1
7     1   NA  7  1
8    NA    0  6  0
9    NA    1  5  1
10   NA   NA  9 NA
> (d <- recode_from_meta(ds, hrule,variable_names=c("raw1", "raw2"), harmony_name="h2"))
   raw1 raw2 id h2
1     0    0  4  0
2     0    1  3  0
3     0   NA  8 NA
4     1    0  2  0
5     1    1  1  1
6     1    1 10  1
7     1   NA  7 NA
8    NA    0  6 NA
9    NA    1  5 NA
10   NA   NA  9 NA
于 2016-03-29T02:02:57.637 に答える