偶尔,我写的函数会将一个主题从表单中完全删除。我知道为什么会发生这种情况(基本上,他有一天什么都没做,并且一度被函数所做的事情过滤掉(。现在,当它发生时,我一直在"修复"它,但这让我想到了我的问题。
实际上,在我的定点修复中,我所做的就是让动物留在最终的电子表格中,在那里,无论它从哪一列中筛选出来,它的值最终都是0或NA(以适用于每种情况的值为准,例如,频率为0或反应时间为NA(。
但是,有没有办法让我在后台做这件事。
在我的函数之后,我得到了我的"清理"数据帧,它应该有20只动物(K1-K20(,但它只有19只(例如缺少K3(。
我该如何写一个函数来表示:
"如果‘主题’不包括在这个数据框中(从这个‘主题’列表中?(,无论如何都要添加它,并在另一列中为它们放一个NA">
希望这是有道理的。
谢谢!
如果我理解正确,OP已经创建了一个或多个Subject
中缺少行的数据集,并且他希望根据Subjects
的列表来完成这些行。
这可以通过不同的方式解决。我的首选方式是加入或合并。另一种方法是使用complete()
函数。不同方法的输出有一些细微的差异。
但首先我们需要创建合适的样本数据。
创建示例数据
# complete vector of all subjects
Subjects <- sprintf("K%02i", 1:10)
# data.frame with subject K03 missing
DF <- droplevels(data.frame(Subject = Subjects,
value = seq_along(Subjects) / 10)[-3L, ])
Subjects
D_4[1] "K01" "K02" "K03" "K04" "K05" "K06" "K07" "K08" "K09" "K10"
注意,Subject
是一个因子,因子水平中也缺少K03
(由于droplevels()
(
str(DF)
'data.frame': 9 obs. of 2 variables: $ Subject: Factor w/ 9 levels "K01","K02","K04",..: 1 2 3 4 5 6 7 8 9 $ value : num 0.1 0.2 0.4 0.5 0.6 0.7 0.8 0.9 1
碱基Rmerge()
merge(data.frame(Subject = Subjects), DF, all.x = TRUE)
Subject value 1 K01 0.1 2 K02 0.2 3 K03 NA 4 K04 0.4 5 K05 0.5 6 K06 0.6 7 K07 0.7 8 K08 0.8 9 K09 0.9 10 K10 1.0
K03
的行已完成。
请注意,Subject
仍然是merge()
之后的一个因子,但也完成了因子水平:
'data.frame': 10 obs. of 2 variables: $ Subject: Factor w/ 10 levels "K01","K02","K03",..: 1 2 3 4 5 6 7 8 9 10 $ value : num 0.1 0.2 NA 0.4 0.5 0.6 0.7 0.8 0.9 1
SQL
S <- data.frame(Subject = Subjects)
sqldf::sqldf("select * from S left natural join DF")
打印输出与上面类似,但Subject
已被强制键入字符,无提示:
'data.frame': 10 obs. of 2 variables: $ Subject: chr "K01" "K02" "K03" "K04" ... $ value : num 0.1 0.2 NA 0.4 0.5 0.6 0.7 0.8 0.9 1
数据表
library(data.table)
setDT(DF)[.(Subject = Subjects), on = "Subject"]
打印的输出与上面相同,但Subject
被强制以静默方式键入字符。
dplyr
dplyr::right_join(DF, data.frame(Subject = Subjects))
# or
dplyr::left_join(data.frame(Subject = Subjects), DF)
两者都返回一个数据帧,其中Subject
被强制键入字符并打印警告:
列
Subject
具有不同级别的连接因子,强制为字符矢量
tidyr::complete((
tidyr::complete(DF, Subject = Subjects)
返回tibble并打印警告:
# A tibble: 10 x 2 Subject value <chr> <dbl> 1 K01 0.1 2 K02 0.2 3 K03 NA 4 K04 0.4 5 K05 0.5 6 K06 0.6 7 K07 0.7 8 K08 0.8 9 K09 0.9 10 K10 1 Warning message: Column `Subject` joining character vector and factor, coercing into character vector