R 如何根据列的值将特定行减去数据帧的一部分
我是一个新的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
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区分大小写!我已经更改了物种名称,它现在运行得很好!谢谢!