R 重塑数据集
我正在重塑数据集,以便在lme4包中运行HLM 我主要尝试了重塑2包中的melt函数和dplyr包中的其他函数。但是,他们没有给我想要的 以下是我现在拥有的数据集: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
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")