根据R中另一列中的唯一值创建批次的升序值,并批量添加新数据

威尔·汉密尔顿

我曾在Python中问过类似的问题(如何基于pandas另一列中的唯一值创建升序列),并使脚本正常工作,但是由于各种原因,我现在需要在R中实现相同的目的。我在这里也增加了复杂性,因为希望能够定期向数据集中添加新的一批数据。

我有一个样本列表,这些样本具有唯一的样本ID号(“ Sample_ID”)。数据集的每一行都是一个样本。一些样本被重复多次。我想创建一组新的样本名称(“ Sample_code”),当您使用前缀(例如“ SAMP00001”,“ SAMP00002”等)在行中向下移动时,它们将从1升序。我希望保留行的顺序(因为它们大致按样本收集的日期顺序)。对于重复的样本,我希望为Sample_code给出的数字对应于样本ID出现在第一行,而不是表格后面的行(在样本收集的后面)。

我的起始数据用df1进行了说明:

# df1
Sample_ID <- c('123123','123456','123123','123789')
Date <- c('15/06/2019', '23/06/2019', '30/06/2019', '07/07/2019')
Variable <- c("blue","red","red","blue")
Batch <- 1
df1 <- data.frame(Sample_ID, Date, Variable, Batch)
df1

我想创建df1b中显示的Sample_code列:

# df1b
Sample_ID <- c('123123','123456','123123','123789')
Date <- c('15/06/2019', '23/06/2019', '30/06/2019', '07/07/2019')
Variable <- c("blue","red","red","blue")
Batch <- 1
Sample_code <- c('SAMP0001', 'SAMP0002', 'SAMP0001', 'SAMP0003')

df1b <- data.frame(Sample_ID, Date, Variable, Batch, Sample_code)
df1b

此时,我将保存df1b以及用于下游处理的那些Sample_code名称。之所以增加复杂性,是因为我随后将收集一批新的样本-我们将其称为df2(第2批样本):

# df2
Sample_ID <- c('456789', '123654', '123123', '123789', '121212')
Date <- c('15/07/2019', '31/07/2019', '12/08/2019', '27/08/2019', '31/08/2019')
Variable <- c("blue", "red","blue", "red", "red")
Batch <- 2

df2 <- data.frame(Sample_ID, Date, Variable, Batch)
df2

我想将df2绑定到df1的底部,并为新行生成更多的Sample_code名称。重要的是,新的Sample_code名称需要考虑df1中存在的所有Sample_ID重复项,但也不要更改当我只有df1时已经分配回的任何Sample_code名称。此时的结果将是df2b,如下所示:

# df2b
Sample_ID <- c('123123','123456','123123','123789','456789', '123654', '123123', '123789', '121212')
Date <- c('15/06/2019', '23/06/2019', '30/06/2019', '07/07/2019', '15/07/2019', '31/07/2019', '12/08/2019', '27/08/2019', '31/08/2019')
Variable <- c("blue","red","red","blue","blue", "red","blue", "red", "red")
Batch <- c(1,1,1,1,2,2,2,2,2)
Sample_code <- c('SAMP0001', 'SAMP0002', 'SAMP0001', 'SAMP0003', 'SAMP0004', 'SAMP0005', 'SAMP0001', 'SAMP0003', 'SAMP0006')
df2b <- data.frame(Sample_ID, Date, Variable, Batch, Sample_code)
df2b

然后我将以相同的方式等添加批3样本

我知道至少有两个阶段可以解决此问题:1)使用唯一的Sample_ID值产生一个升序的Sample_code名称列表;2)以迭代的方式添加一批样品。但是由于第二点影响了我想要的Sample_code名称的功能,因此我在这里包括了两个阶段。

最后-理想情况下,我只想使用base R和tidyverse软件包。

任何帮助,不胜感激!谢谢。

完善

因为您需要在分配示例代码之前了解所有可能的示例ID,所以请考虑通过调用rbind所有示例数据帧来反转顺序然后使用级别分配Sample_codefactor否则,为每个批处理数据帧重新分配Sample_code

# BUILD A LIST OF DATA FRAMES BY CALLING lapply ON ITERATIVE PROCESS 
# df_list <- lapply(batch_iterable, method_to_build_sample)
df_list <- list(df1, df1b, df2)       # FOR THIS PARTICULAR POST

# RBIND ALL DFs TOGETHER
df2b <- do.call(rbind, df_list)

df2b <- within(df2b, {
    # CONVERT TO CHARACTER
    Sample_ID <- as.character(Sample_ID)

    # CONVERT TO FACTOR AT POSITIONED VALUES, THEN INTEGER FOR LEVEL NUMBER
    Sample_code <- as.character(as.integer(factor(Sample_ID, levels = unique(Sample_ID))))

    # RE-ASSIGN WITH SAMP AND LEADING ZEROS 
    Sample_code <- ifelse(nchar(Sample_code) == 1, paste0('SAMP000', Sample_code),
                          ifelse(nchar(Sample_code) == 2, paste0('SAMP00', Sample_code),
                                ifelse(nchar(Sample_code) == 3, paste0('SAMP0', Sample_code), NA)
                         )
                   )
})

df2b
#   Sample_ID       Date Variable Batch Sample_code
# 1    123123 15/06/2019     blue     1    SAMP0001
# 2    123456 23/06/2019      red     1    SAMP0002
# 3    123123 30/06/2019      red     1    SAMP0001
# 4    123789 07/07/2019     blue     1    SAMP0003
# 5    456789 15/07/2019     blue     2    SAMP0004
# 6    123654 31/07/2019      red     2    SAMP0005
# 7    123123 12/08/2019     blue     2    SAMP0001
# 8    123789 27/08/2019      red     2    SAMP0003
# 9    121212 31/08/2019      red     2    SAMP0006

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据另一列中的值创建新列

根据r中另一列的观测值创建新列

添加新列并根据另一列中的值在列中插入值

根据另一列中的唯一值汇总一列中的值

根据另一列中的重复值过滤一列中的唯一值

R:根据另一列中的值提取一列中的唯一值匹配

根据数据框中另一列的值汇总和计算一列的唯一值

根据熊猫中另一列上的值在数据框中创建一个新列

根据熊猫中数据框的另一列的值添加一列

根据数据框中另一列的值添加一列

根据另一列中的唯一值查找一列中的重复项

根据数据框中另一列的唯一值查找一列的所有组合

r-根据组中另一列中的唯一值排列列中的值

根据另一列中的值将值添加到熊猫数据框的一列中

在R中的多个数据框中的一列中创建唯一值列表

根据R中的唯一值将一列数据细分为多个列

在熊猫中,如何从一列中的唯一值中创建列,然后根据另一列中的值填充它?

在 Pandas 中创建一列,计算另一列中唯一值的数量

如何从R中的两个不同数据帧中添加两列,其中一列只是另一列的唯一值的子集

根据来自另一列的值在 R 数据框中添加一个带有 html 标签的新列

根据前一列中的值创建新列

从另一列创建一列列表,并在 Pandas 数据框中仅显示唯一值

遍历一列并根据 PANDAS 数据框中另一列的值将值添加到列表

根据数据框 R 中另一列中的值复制值

根据Pandas中另一列的值添加新列(python)

根据另一列pandas python的值在python中添加新列

根据另一列的值在熊猫中创建新列

是否可以根据值在另一列中更改的时间来创建新列?

使用 map() 时出错:根据另一列中的值创建新的 Pandas 列