R 如何根据列的值将特定行减去数据帧的一部分

R 如何根据列的值将特定行减去数据帧的一部分,r,dataframe,R,Dataframe,我是一个新的R用户,如果有人能帮我弄明白这一点,那就太棒了 我有如下数据: eDNA.data Sample Extraction_batch Species 1 Species 2 Specie3 Species 4 CH15_25 CH_1 0 39 10 0 CH15_89 CH_2 11

我是一个新的R用户,如果有人能帮我弄明白这一点,那就太棒了

我有如下数据:

eDNA.data 

    Sample     Extraction_batch    Species 1     Species 2    Specie3    Species 4
    CH15_25    CH_1                0             39           10         0
    CH15_89    CH_2                11            0            55         0
    CH15_56    CH_1                0             0            0          13
    CH15_16    CH_1                27            12           0          7
    CH15_21    CH_2                0             0            2          0
    CH15_negA  CH_1                0             1            0          0
    CH15_negB  CH_2                0             0            2          1
    IQ15_10    IQ_1                8             67           43         0
    IQ15_64    IQ_1                17            0            24         6
    IQ15_17    IQ_2                5             0            0          0
    IQ15_87    IQ_1                0             11           7          0
    IQ15_negA  IQ_1                1             0            0          0
    IQ15_negB  IQ_2                0             0            1          1
我总共有218个物种,还有更多的样本(总共148个)是DNA提取。
Extraction\u batch
列对应于样本所属的提取(因为我当时只能进行24次),并且对于每个提取批次,有一个阴性对照对应。阴性对照为空白样品,以检查提取过程中是否发生污染

我想将负片控件的行(例如IQ15_negA)减去列
提取批次
中相同值对应的所有行。因此,我可以获得一个新的数据帧无污染


如何在R中实现这一点?

考虑用neg值对dataframe进行子集设置,然后将neg_df和clean_df合并在一起,以进行列减法:

# CREATE SAMPLE STUB NAME
df$Sample_stub <- substr(df$Sample, 1, 4)

# FILTER FOR NEG ROWS, DROP SAMPLE, RENAME SPECIES COLS WITH NEG_ PREFIX
neg_df <- transform(df[grepl("neg", df$Sample),], Sample = NULL)
names(neg_df)[grep("Species", names(neg_df))] <- paste0("Neg_", names(neg_df)[grep("Species", names(neg_df))])

# FILTER FOR CLEAN ROWS
clean_df <- df[!grepl("neg", df$Sample),]

# MERGE BOTH SETS, DROP STUB NAME
final_df <- merge(clean_df, neg_df, by=c("Sample_stub", "Extraction_batch"))[-1]

# BLOCKWISE (MULTI-COLUMN) SUBTRACTION
final_df[, grep("^Species", names(final_df))] <- final_df[, grep("^Species", names(final_df))] - 
                                                 final_df[, grep("^Neg", names(final_df))]
# REMOVE NEG SPECIES COLUMNS
final_df[, grep("^Neg", names(final_df))] <- NULL

final_df
#   Extraction_batch  Sample Species1 Species2 Species3 Species4
# 1             CH_1 CH15_25        0       38       10        0
# 2             CH_1 CH15_56        0       -1        0       13
# 3             CH_1 CH15_16       27       11        0        7
# 4             CH_2 CH15_89       11        0       53       -1
# 5             CH_2 CH15_21        0        0        0       -1
# 6             IQ_1 IQ15_10        7       67       43        0
# 7             IQ_1 IQ15_64       16        0       24        6
# 8             IQ_1 IQ15_87       -1       11        7        0
# 9             IQ_2 IQ15_17        5        0       -1       -1
#创建样本存根名称

df$Sample_存根请求帮助时,您应该包括一个简单的示例输入和所需的输出,可用于测试和验证可能的解决方案。一些动词/词汇可能重复,以帮助您搜索相关问题并解决您的问题:您正在尝试按
提取\u批次
分组,并将其他列相对于特定行进行规范化在每组内。也可以更容易/更自然地(虽然不是乍一看)将“负”行分离到它们自己的
数据中。frame
,与此表分离。然后你可以将“负数”表加入到普通表中,然后进行减法运算。非常感谢!我已经试了好几次你的脚本,但是在第二步
neg_df See update中出现了问题,其中子集行和重命名列是在两行中完成的。它几乎可以工作了!合并
clean_-df
neg_-df
后,物种名称重复,看起来像species1.x和species1.y,因此在按块减法时,未减去neg_-df的列:/n您没有成功重命名,因为它本应避免名称冲突。我现在看到你的物种是小写的,不像你上面的帖子。R区分大小写!我已经更改了物种名称,它现在运行得很好!谢谢!