我正在重塑我的数据集,以便在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,因为在重新整形的数据集中包含了所有内容(没有任何内容)。
答案 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::melt
和na.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")
...