我有一个名为“ samples”的数据框,看起来像这样:
sample gender disease treatment
sample1 F d starved
sample2 F c fed
sample3 M d starved
sample4 M d fed
sample5 M d starved
sample6 M c fed
etc
我需要将其导入脚本中,然后relevel()列“性别”,“疾病”和“治疗”。
现在重要的是,我正在构建一个尽可能通用的管道-除了第一列(始终称为“ sample”)外,“ samples”(列)中的列名称可能并不总是相同的“。
因此,我的R脚本的目的是导入配置文件(YAML),这将导致一个data.frame看起来像这样,并被称为“因素”:
gender disease treatment
F control fed
现在,我如何遍历这个“因素”以告诉它重新调整“样本”中的相应列-注意我如何确保列名在两个数据框之间匹配。到目前为止,我已经尝试过了,但是没有用:
for (i in names(factors)){
samples[[i]] <- relevel(samples[[i]], factors[[i]])
}
我收到的错误消息是:
Error in if (ref < 1 || ref > nlev) stop(gettextf("ref = %d must be in 1L:%d", :
missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In Ops.factor(ref, 1) : ‘<’ not meaningful for factors
2: In Ops.factor(ref, nlev) : ‘>’ not meaningful for factors
答案 0 :(得分:0)
请注意,您提供的示例中存在数据不一致:factors
包含"disease"
的参考级别,而该参考级别在samples
中不存在:"control"
与{{ 1}}。我认为这是一个错字,"c"
(和您的原始YAML文件)实际上对于列factors
的引用级别为"c"
(请参阅文章末尾的示例数据)
此外,我假设"disease"
和samples
中所有列的列类均为factors
。这应该不是关键要求,但是对于character
或samples
中的列为factors
的情况,我尚未进行过测试。
这是一个应该很好地概括的选项。
我们从factor
除 samples
(根据您的问题描述始终存在)中选择所有列,然后使用samples$sample
将列转换为{ {1}}和purrr::imap
使用来自factors
中相应列条目的参考级别。其余的与原始relevel
列进行列绑定,以提供最终重新定级的factors
samples$sample
。
samples.relevel
data.frame