R 在数据帧中的重复数据之间进行选择

R 在数据帧中的重复数据之间进行选择,r,duplicates,dataframe,binning,R,Duplicates,Dataframe,Binning,早些时候,我问了一个关于从数据帧中提取重复行的问题。我现在需要运行一个脚本来决定在最终的数据集中保留哪些副本 此数据集中的重复条目具有相同的“分析”和“样本”值。以下是我正在处理的新数据集的前10行,其中包含我的重复条目: Assay Sample Genotype Data 1 CCT6-002 1486 A 1 2 CCT6-002 1486 G 0 3 CCT6-002 1997

早些时候,我问了一个关于从数据帧中提取重复行的问题。我现在需要运行一个脚本来决定在最终的数据集中保留哪些副本

此数据集中的重复条目具有相同的“分析”和“样本”值。以下是我正在处理的新数据集的前10行,其中包含我的重复条目:

     Assay   Sample    Genotype   Data
1  CCT6-002   1486         A        1
2  CCT6-002   1486         G        0
3  CCT6-002   1997         G        0
4  CCT6-002   1997         NA       NA
5  CCT6-002   0050         G        0
6  CCT6-002   0050         G        0
7  CCT6-015   0082         G        0
8  CCT6-015   0082         T        1
9  CCT6-015   0121         G        0
10 CCT6-015   0121         NA       NA
我想运行一个脚本,根据“数据”的值(可以是1、0或NA)将这些重复样本分成4个箱子:

 1) All values for 'Data' are NA
 2) All values for 'Data' are identical, no NA
 3) At least 1 value for 'Data' is not identical, no NA.
 4) At least 1 value for 'Data' is not identical, at least one is NA.
上述数据的预期结果如下:

Set 1
Null

Set 2
5  CCT6-002   0050         G        0
6  CCT6-002   0050         G        0

Set 3
1  CCT6-002   1486         A        1
2  CCT6-002   1486         G        0
7  CCT6-015   0082         G        0
8  CCT6-015   0082         T        1

Set 4
3  CCT6-002   1997         G        0
4  CCT6-002   1997         NA       NA
9  CCT6-015   0121         G        0
10 CCT6-015   0121         NA       NA
在某些情况下,此数据集中存在两个以上的“重复”数据点。我甚至不知道从哪里开始,因为我是R的新手


编辑:使用预期数据。

这应该是一个良好的开端。根据数据集的长度,为提高速度而对其进行优化可能值得,也可能不值得

require(plyr)

# Read data
data = read.table('data.txt', colClasses=c(NA, NA, 'character', NA, NA))

# Function to pick set
pickSet <- function(x) {
  if(all(is.na(x$Data))) {
    set = 1
  } else if(length(unique(x$Data)) == 1) {
    set = 2
  } else if(!any(is.na(x$Data))) {
    set = 3
  } else {
    set = 4
  }
  data.frame(Set=set)
}

# Identify Set for each combo of Assay and Sample
sets = ddply(data, c('Assay', 'Sample'), pickSet)

# Merge set info back with data
data = join(data, sets)

# Reformat to list
sets.list = lapply(1:4, function(x) data[data$Set==x,-5])
require(plyr)
#读取数据
data=read.table('data.txt',colClasses=c(NA,NA,'character',NA,NA))
#拾取集合的函数
pickSet.list
[[1]]
[1] 分析样本基因型数据
(或长度为0的行名称)
[[2]]
分析样本基因型数据
5 CCT6-002 0050 G 0
6 CCT6-002 0050 G 0
[[3]]
分析样本基因型数据
1 CCT6-002 1486 A 1
2 CCT6-002 1486 G 0
7 CCT6-015 0082 G 0
8 CCT6-015 0082 T 1
[[4]]
分析样本基因型数据
3 CCT6-002 1997 G 0
4 CCT6-002 1997不适用
9 CCT6-015 0121 G 0
10 CCT6-015 0121 NA

你问了一个问题,这个问题的方向是让别人为你完成全部工作。一个关于这个项目中某个特定部分的问题可能更容易引起回应。你正在努力解决的阻碍你开始的问题是一项非常基本的编程技能:能够将你的问题分解成具体的小步骤,逐个解决,然后再将它们组合起来解决你原来的问题

不过,这项技能也很难学。但是你有一个好的开始!您已经很好地指定了数据可以分为四组:

  • “数据”的所有值均为NA

  • “数据”的所有值均为 一模一样,没有

  • “数据”至少有1个值不相同,否 不

  • “数据”的值至少有1个不相同,至少有一个不相同 不

  • 现在,您需要考虑,如果您只有一个子集的数据,您如何确定它在R中属于哪个组(1-4)?下面是一些可能有用的工具的草图。构建一些子集并在控制台中进行游戏,直到您能够轻松识别每个组:

    (1)
    datSub$Data
    NA
    s的所有值都是吗

    工具:
    all
    is.na

    (2) 只有一个唯一值,而不是
    NA

    工具:
    length
    unique
    is.na
    any

    (3) 多个唯一值,无
    NA
    s

    工具:
    length
    unique
    any
    is.na

    (4) 多个唯一值,至少一个
    NA

    工具:
    length
    unique
    any
    is.na

    不使用所有这些函数也可以做到这一点,但它们都可能有用

    一旦您知道如何确定特定子集应该属于哪个组,就可以将代码包装到函数中。我的建议是创建一个值为1-4的新列,具体取决于该子集属于哪个组:

    myFun <- function(x){
        if (...){
            x$grp <- 1
        }
        if (...){
            x$grp <- 2
        }
        #etc.
    
        return(x)
    }
    
    最后在新的
    grp
    变量上拆分此数据帧:

    split(dat,dat$grp)
    
    希望这张素描能帮助你开始。但是你会有问题的。每个人都有。如果你在这一过程中遇到了具体的问题,请随意问另一个问题


    事实上,我现在看到约翰已经按照我的草图给出了答案。不过,我还是会发布这个答案,希望它能帮助您分析未来的问题。

    根据这些数据,您的预期结果是什么?还有,到目前为止你试过什么?你在哪里陷入困境?@Andrie我从示例中添加了预期的数据。我真不知道从哪里开始。我和R一起工作才几个星期。@joran非常感谢你的帮助。我决不想让别人替我做事,所以如果事情是这样的话,我很抱歉。我正在尽我最大的努力学习R,有时会陷入困境。今后我一定会问更多有针对性的问题。再次感谢。
    split(dat,dat$grp)