【发布时间】:2017-07-11 16:31:06
【问题描述】:
我需要一种方法来根据 target_id 过滤我的数据。因为我有一组 1600 个没有一致名称的 target_id 值,而另一组包含单词“comp”,所以我认为创建一个具有基于 target_id 值的值的新列可能是最简单的。我有一个有一百万行的数据框,看起来像这样(只是抓取随机行来显示它的要点):
sample_id target_id l ength eff_length est_counts tpm
159 SRR3884838C CR1_Mam 2204 2005 0 0
160 SRR3884838C CYRA11_MM 617 418 0 0
161 SRR3884838C DERV2a_I 5989 5790 19 0.734541
162 SRR3884838C DERV2a_LTR 335 136 7 11.5213
1094236 SRR3884878C comp78901_c0_seq3_1 1115 916 113.4 32.3604
1094237 SRR3884878C comp85230_c0_seq1_1 1201 1002 514 134.088
1094238 SRR3884878C comp56944_c0_seq1_1 2484 2285 10.5 1.20115
我需要创建一个新列(“类”),其中包含“comp”的 sample_ids 的值为 1,所有其他列的值为 0。这可能吗?数据有 40 个样本(SRR3884838 --> SRR3884878),每个样本都有相同的 target_ids 集,一组不统一的目标名称,然后是另一组都包含 comp。示例(由于格式原因删除了 tpm 列)
sample_id target_id length eff_length est_counts class
159 SRR3884838C CR1_Mam 2204 2005 0 0
160 SRR3884838C CYRA11_MM 617 418 0 0
161 SRR3884838C DERV2a_I 5989 5790 19 0
162 SRR3884838C DERV2a_LTR 335 136 7 0
1094236 SRR3884878C comp78901_c0_seq3_1 1115 916 113.4 1
1094237 SRR3884878C comp85230_c0_seq1_1 1201 1002 514 1
1094238 SRR3884878C comp56944_c0_seq1_1 2484 2285 10.5 1
我尝试使用合并函数,首先创建一个新的数据框,该数据框的类列具有一组 target_ids 的正确值,可能不正确的期望是它将创建新列,其中一个 target_ids 的实例已列出,但是当我这样做时,它删除了 eff_length 列并弄乱了数据的格式。我发现的所有示例中,用户根据使用数字的另一列值创建新列,但我不知道如何使用字符串 comp 来实现。这是我所做的:
total <- merge(data frameA,data frameB,by="target_id")
df A 是我的原始数据,而 df B 看起来像上面带有类列的示例。
【问题讨论】:
-
df$class <- grepl('comp', df$taget_id)会给出一个逻辑向量;将grepl部分包裹在as.numeric或as.integer中,得到一个由0 和1 组成的向量。
标签: r