重塑数据集

时间:2016-06-22 15:15:06

标签: r reshape reshape2

我正在重塑我的数据集,以便在lme4包中运行HLM。

我主要尝试了reshape2包中的融合功能以及dplyr包中的其他功能。但是,他们没有给我我想要的东西。

这是我现在拥有的数据集:

ID    Totalscore Gender SA3B  SB3C  SJJD  SUAB
0511  390        F      1     NA    NA    NA
0522  340        M      NA    0     NA    NA
0533  180        F      NA    1     0     NA
0782  301        M      NA    NA    NA    1

ID是考生ID。 " SAEB,SB3C,SJJD,SUAB"是测试中的项目。有超过3000个项目,而不是每个考生都看到每个项目。 1表示正确答案,否则为0。因此,数据集中有许多NA。

这是我想要获得的重塑数据集:

Examinee      0511   0522  0533  0533  0782
Total Score   390    340   180   180   301
Gender        F      M     F     F     M
Item          SA3B   SB3C  SB3C  SJJD  SUAB
Itemscore     1      0     1     0     1

我的困难在于,不同的考生会看到不同数量的项目,而在我想要获得的最终数据集中,应该没有NAs,因为在重新整形的数据集中包含了所有内容(没有任何内容)。

2 个答案:

答案 0 :(得分:1)

您可以使用melt,然后过滤掉NA值的行:

library(dplyr); library(tidyr); library(reshape2);

melt(df, id.vars = c("ID", "Totalscore", "Gender"), 
         variable.name = "Item", value.name = "Itemscore") %>% 
filter(complete.cases(.)) %>% t %>% data.frame

#              X1   X2   X3   X4   X5
# ID          511  522  533  533  782
# Totalscore  390  340  180  180  301
# Gender        F    M    F    F    M
# Item       SA3B SB3C SB3C SJJD SUAB
# Itemscore     1    0    1    0    1

答案 1 :(得分:1)

这可能只是对格式化的困惑,但是如果我采用你在字面上发布的转换后的数据集(即数据集的不同中的不同变量),那么不是< / em>一个对于lme4适合HLM实际有用的表单;你需要变量作为列。另一方面,这可能就是你的意思,在这种情况下,我的解决方案相对于@ Psidom的唯一优势是你只需要基础R的reshape2::meltna.omit,没有工具(管道,dplyr等)除此之外。

我会这样做:

## get data
dd <- read.table(header=TRUE,text="
ID    Totalscore Gender SA3B  SB3C  SJJD  SUAB
0511  390        F      1     NA    NA    NA
0522  340        M      NA    0     NA    NA
0533  180        F      NA    1     0     NA
0782  301        M      NA    NA    NA    1")

library(reshape2)
na.omit(melt(dd,id.vars=1:3,value.name="Itemscore",
             variable.name="Item"))

##     ID Totalscore Gender     Item Itemscore
## 1  511        390      F     SA3B     1
## 6  522        340      M     SB3C     0
## 7  533        180      F     SB3C     1
## 11 533        180      F     SJJD     0
## 16 782        301      M     SUAB     1

然后你可以做类似

的事情
glmer(Itemscore~Gender+Totalscore+ (1|ID/Item) + (1|Item),
      family="binomial")

...