我正在尝试分析一些数据,作为我论文的一部分,但开发代码证明是不可能的(对我而言)
我正在使用更大的数据子集来开发我的代码。 (不确定如何链接数据框)
head(df)
well x y time dist speed grp
1 1 117 127 15.265 0.000000 0.00000000 1
2 1 118 127 15.303 1.000000 0.06534666 1
3 1 118 127 15.339 0.000000 0.00000000 1
4 1 118 127 15.368 0.000000 0.00000000 1
5 1 119 129 15.403 2.236068 0.14517094 1
6 1 120 129 15.443 1.000000 0.06475426 1
tail(df)
well x y time dist speed grp
664074 24 519 345 6957.419 0.000000 0.0000000000 24
664075 24 519 345 6957.453 0.000000 0.0000000000 24
664076 24 519 345 6957.490 0.000000 0.0000000000 24
664077 24 519 345 6957.529 0.000000 0.0000000000 24
664078 24 518 345 6957.557 1.000000 0.0001437286 24
664079 24 517 344 6957.598 1.414214 0.0002032618 24
基本上,X
,Y
值来自24孔板。记录周期结束后,grp
值将增加N + 1(只是grp
/ well
以相同值结束的巧合)。
在每个录制时段之后,录制中断,一旦完成录制,录制将重新开始。我目前正在尝试分析我设置为NA
的数据中的缺失值。为了找到缺失的值,我使用了这个代码(下面)使用了MICE包。我希望每个小组的每个well
分别由MICE包进行分析 - 而不是所有X
,Y
坐标。
for (i in unique(df$well)){
w1 <- df[df$well==i,]
for (j in unique(w1$grp)){
w2 <- w1[w1$grp==j,]
temp_df <- mice(data = w2, m = 5, method = "rf", maxit = 5)
}
}
两件事 - 首先,for循环非常慢,我不确定如何提高脚本的速度。我最初的想法是在我的d.f中创建一个新列,每当df$well
值发生变化时,该列将填充N + 1,因为这将包含df$well
&amp; df$grp
,但我无法提出产生此功能的功能。一旦生成了新列,我可以使用一个for循环,而不是上面的两个 - 我认为这会提高速度?其次,上面的脚本不断重写“temp_df”,而我要求它添加到它 - 我尝试使用“rbind”和“apply”这些已经从搜索结果中建议但无济于事。
道歉,如果这看起来相对简单,或已在其他地方得到回答。正如我所说,我对R和计算语言一般都比较新。
答案 0 :(得分:1)
使用expand.grid()
和lapply()
# DATA FRAME OF ALL COMBINATIONS BETWEEN WELL AND GRP
matches <- expand.grid(unique(df$well), unique(df$grp))
# LIST OF DFs
dfList <- lapply(seq_len(nrow(matches)), function(i) {
x <- data.frame(df[(df$well == matches$Var1[i]) &
(df$grp == matches$Var2[i]),])
temp_df <- mice(data = x, m = 5, method = "rf", maxit = 5)
})
# ROW BIND LIST OF DFs
finaldf <- do.call(rbind, dfList)