如何说'value'是否不包含在此数据框列中(来自此"值"列表),无论如何都要为其添加一行,并在其他列中放置一个 NA


设置:我和动物一起做行为任务。我写了一个函数来获取我的原始数据并"清理它",基本上,然后我将其应用于许多不同的数据表。这个数据中有20个受试者,我们只说K1,K2…K20。

偶尔,我写的函数会将一个主题从表单中完全删除。我知道为什么会发生这种情况(基本上,他有一天什么都没做,并且一度被函数所做的事情过滤掉(。现在,当它发生时,我一直在"修复"它,但这让我想到了我的问题。

实际上,在我的定点修复中,我所做的就是让动物留在最终的电子表格中,在那里,无论它从哪一列中筛选出来,它的值最终都是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
[1] "K01" "K02" "K03" "K04" "K05" "K06" "K07" "K08" "K09" "K10"
D_4

注意,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

最新更新