R 重塑数据集

R 重塑数据集,r,reshape,reshape2,R,Reshape,Reshape2,我正在重塑数据集,以便在lme4包中运行HLM 我主要尝试了重塑2包中的melt函数和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

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

我主要尝试了重塑2包中的melt函数和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,因为所有内容都包含在重新修改的数据集中(没有任何内容丢失)。

您可以使用
熔化
然后过滤出具有
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

这可能只是格式上的混乱,但如果我按照字面意思(即数据集不同行中的不同变量)使用您上面发布的转换数据集,它对于HLM与
lme4
的拟合实际上不是一种有用的形式;您需要变量作为列。另一方面,这可能是您的意思,在这种情况下,我的解决方案相对于@Psidom的唯一优势是,您只需要
reforme2::melt
na。从基本R中省略
,除此之外没有其他工具(管道,
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

@Frank Yep。忘了装包裹吧。谢谢嗨,Psidom,谢谢你的回答。但在我的原始数据集中,没有称为“Item”和“Itemscore”的变量。我想这就是我发现困难的地方。数据集就是文章中的样子:)
Item
Itemscore
是在将数据集从宽转换为长时创建的列。因为您的结果包含两行,所以我重命名了变量名和值名。我现在明白了。成功了!我对造成的混乱表示歉意。非常感谢你!!!Psidom!!嗨,本。非常感谢你在这方面的帮助!!我正在查看的数据集是lme4包中的
“InstEval”
数据集<代码>str(InstEval)。我认为你呈现数据的方式是我的转置版本。我说得对吗?`我认为这主要是一种格式/表达混乱。比较
str(InstEval)
(它打印列表中的每个元素)和
head(InstEval)
-是的,我的是从你的转换过来的。
glmer(Itemscore~Gender+Totalscore+ (1|ID/Item) + (1|Item),
      family="binomial")