R:根据另一个数据框的列重新调整一个数据框的列

时间:2019-04-09 14:55:46

标签: r loops factors

我有一个名为“ 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

1 个答案:

答案 0 :(得分:0)

请注意,您提供的示例中存在数据不一致:factors包含"disease"的参考级别,而该参考级别在samples中不存在:"control"与{{ 1}}。我认为这是一个错字,"c"(和您的原始YAML文件)实际上对于列factors的引用级别为"c"(请参阅文章末尾的示例数据)

此外,我假设"disease"samples中所有列的列类均为factors。这应该不是关键要求,但是对于charactersamples中的列为factors的情况,我尚未进行过测试。

这是一个应该很好地概括的选项。

我们从factor samples(根据您的问题描述始终存在)中选择所有列,然后使用samples$sample将列转换为{ {1}}和purrr::imap使用来自factors中相应列条目的参考级别。其余的与原始relevel列进行列绑定,以提供最终重新定级的factors samples$sample

samples.relevel

样本数据

data.frame