R 如何说如果';价值';isn';t包括在此数据框列中(从';值列表中),为其添加一行,并在另一列中添加NA
设置:我和动物一起做行为任务。我编写了一个函数来获取原始数据并“清理”,基本上,然后我将它应用到许多不同的数据表中。这个数据有20个主题,我们只会说K1,K2。。。K20 有时,我编写的函数会从工作表中完全删除一个主题。我知道为什么会发生这种情况(基本上,他一天什么都没做,只是被函数在某一点上做的事情过滤掉了)。现在,当它发生时,我一直在进行“现场修复”,但这带来了我的问题 实际上,我在定点时所做的就是让动物留在最终的电子表格中,从中筛选出的任何列的值最终都是0或NA(以适用于每种情况的值为准,例如频率为0或反应时间为NA) 但是,是否有一种方法可以在后端执行此操作 在我的函数之后,我得到了我的“清理”数据框,它应该有20个动物(K1-K20),但它只有19个(例如缺少K3) 我将如何编写一个函数来表示: 如果此数据框中不包括“主题”(来自此“主题”列表?),请添加它,并在另一列中为它们添加NA 希望这是有意义的R 如何说如果';价值';isn';t包括在此数据框列中(从';值列表中),为其添加一行,并在另一列中添加NA,r,R,设置:我和动物一起做行为任务。我编写了一个函数来获取原始数据并“清理”,基本上,然后我将它应用到许多不同的数据表中。这个数据有20个主题,我们只会说K1,K2。。。K20 有时,我编写的函数会从工作表中完全删除一个主题。我知道为什么会发生这种情况(基本上,他一天什么都没做,只是被函数在某一点上做的事情过滤掉了)。现在,当它发生时,我一直在进行“现场修复”,但这带来了我的问题 实际上,我在定点时所做的就是让动物留在最终的电子表格中,从中筛选出的任何列的值最终都是0或NA(以适用于每种情况的值为准,
谢谢大家! 如果我理解正确,OP创建了一个或多个
主题
缺少行的数据集,他希望根据主题
列表完成行
这可以用不同的方法解决。我喜欢的方式是加入或合并。另一种方法是使用complete()
函数。不同方法的输出有一些细微的差别
但首先我们需要创建合适的样本数据
创建示例数据
请注意,Subject
是一个因子,因子级别中也缺少K03
(由于droplevels()
)
基本Rmerge()
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