R 如何说如果';价值';isn';t包括在此数据框列中(从';值列表中),为其添加一行,并在另一列中添加NA

R 如何说如果';价值';isn';t包括在此数据框列中(从';值列表中),为其添加一行,并在另一列中添加NA,r,R,设置:我和动物一起做行为任务。我编写了一个函数来获取原始数据并“清理”,基本上,然后我将它应用到许多不同的数据表中。这个数据有20个主题,我们只会说K1,K2。。。K20 有时,我编写的函数会从工作表中完全删除一个主题。我知道为什么会发生这种情况(基本上,他一天什么都没做,只是被函数在某一点上做的事情过滤掉了)。现在,当它发生时,我一直在进行“现场修复”,但这带来了我的问题 实际上,我在定点时所做的就是让动物留在最终的电子表格中,从中筛选出的任何列的值最终都是0或NA(以适用于每种情况的值为准,

设置:我和动物一起做行为任务。我编写了一个函数来获取原始数据并“清理”,基本上,然后我将它应用到许多不同的数据表中。这个数据有20个主题,我们只会说K1,K2。。。K20

有时,我编写的函数会从工作表中完全删除一个主题。我知道为什么会发生这种情况(基本上,他一天什么都没做,只是被函数在某一点上做的事情过滤掉了)。现在,当它发生时,我一直在进行“现场修复”,但这带来了我的问题

实际上,我在定点时所做的就是让动物留在最终的电子表格中,从中筛选出的任何列的值最终都是0或NA(以适用于每种情况的值为准,例如频率为0或反应时间为NA)

但是,是否有一种方法可以在后端执行此操作

在我的函数之后,我得到了我的“清理”数据框,它应该有20个动物(K1-K20),但它只有19个(例如缺少K3)

我将如何编写一个函数来表示:

如果此数据框中不包括“主题”(来自此“主题”列表?),请添加它,并在另一列中为它们添加NA

希望这是有意义的


谢谢大家!

如果我理解正确,OP创建了一个或多个
主题
缺少行的数据集,他希望根据
主题
列表完成行

这可以用不同的方法解决。我喜欢的方式是加入或合并。另一种方法是使用
complete()
函数。不同方法的输出有一些细微的差别

但首先我们需要创建合适的样本数据

创建示例数据 请注意,
Subject
是一个因子,因子级别中也缺少
K03
(由于
droplevels()

基本R
merge()
K03
的行已完成

请注意,
Subject
merge()
之后仍然是一个因子,但也完成了因子级别:

SQL 数据表 打印输出与上面相同,但已强制
主题
以静默方式键入字符

dplyr 两者都返回带有
主题的data.frame,强制键入字符并打印警告:

Subject
将不同级别的因素连接起来,强制 特征向量

tidyr::complete() 返回TIBLE并打印警告:

#一个tible:10x2
主体价值
1 K01 0.1
2K020.2
3 K03 NA
4K040.4
5 K05 0.5
6K060.6
7 K07 0.7
8K080.8
9K090.9
10 K10 1
警告信息:
列'Subject'连接字符向量和因子,强制转换为字符向量

拥有主数据框的结构和要包含的数据框会很有帮助。它可以通过str()获得。请使用
dput
添加数据,并显示相同的预期输出。请阅读相关信息以及如何给出建议。
# 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"
DF
   Subject value
1:     K01   0.1
2:     K02   0.2
3:     K04   0.4
4:     K05   0.5
5:     K06   0.6
6:     K07   0.7
7:     K08   0.8
8:     K09   0.9
9:     K10   1.0
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
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
'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
S <- data.frame(Subject = Subjects)
sqldf::sqldf("select * from S left natural join DF")
'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"]
dplyr::right_join(DF, data.frame(Subject = Subjects))
# or
dplyr::left_join(data.frame(Subject = Subjects), DF)
tidyr::complete(DF, Subject = Subjects)
# 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