【问题标题】:Selecting between duplicate data in a data frame在数据框中的重复数据之间进行选择
【发布时间】:2011-10-20 20:29:58
【问题描述】:

之前我向question 询问了关于从数据框中提取重复行的问题。我现在需要运行一个脚本来决定将哪些重复项保留在我的最终数据集中。

此数据集中的重复条目具有相同的“Assay”和“Sample”值。这是我正在使用的新数据集的前 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

在某些情况下,此数据集中存在超过 2 个“重复”数据点。作为 R 的新手,我什至不知道从哪里开始。

编辑:使用预期数据。

【问题讨论】:

  • 鉴于这些数据,您的预期结果是什么?另外,到目前为止,您尝试过什么?你在哪里卡住了?
  • @Andrie Ive 添加了示例中的预期数据。我honesrlt不知道从哪里开始。我已经用 R 工作了几个星期了。

标签: r duplicates dataframe binning


【解决方案1】:

您提出的问题转向要求其他人为您完成整个工作。关于该项目的单个特定部分的问题可能更有可能引起回应。您正在努力解决的阻碍您开始的问题是一项非常基本的编程技能:能够将您的问题分解为小的具体步骤,单独解决每个步骤,然后将它们重新组合在一起以解决您的原始问题。

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

  1. “数据”的所有值都是 NA

  2. “数据”的所有值都是 相同,没有 NA

  3. “数据”的至少 1 个值不相同,否 不适用。

  4. “数据”至少有 1 个值不相同,至少有一个是 不适用。

现在您需要考虑,如果您只有一个数据子集,您能否弄清楚如何确定它在 R 中的哪个组 (1-4) 中?以下是一些可能对执行此操作有用的工具的草图。构建一些子集并在控制台中进行操作,直到您可以轻松识别每个组:

(1) 是datSub$DataNAs 的所有值吗?

工具:allis.na

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

工具:lengthuniqueis.naany

(3) 多个唯一值,没有NAs?

工具:lengthuniqueanyis.na

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

工具:lengthuniqueanyis.na

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

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

myFun <- function(x){
    if (...){
        x$grp <- 1
    }
    if (...){
        x$grp <- 2
    }
    #etc.

    return(x)
}

然后使用ddply 根据Sample 的值将此函数应用于数据的每个子集:

ddply(dat,.(Sample),.fun = myFun)

最后将这个数据框拆分为新的grp 变量:

split(dat,dat$grp)

希望这个总体草图可以帮助您入门。但是你有问题。每个人都这样做。如果您在此过程中遇到特定问题,请随时提出另一个问题。

确实,我现在看到约翰已经按照我的草图发布了答案。但是,无论如何我都会发布这个答案,希望它可以帮助您分析未来的问题。

【讨论】:

  • @joran 非常感谢您的帮助。我绝不试图让其他人为我做我的工作,所以如果它以这种方式出现,我很抱歉。我尽我最大的努力学习 R 并且有时会卡住。我一定会在未来提出更多尖锐的问题。再次感谢。
【解决方案2】:

这应该是一个好的开始。根据您的数据集的长度,是否值得优化它以获得更好的速度。

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])
> sets.list
[[1]]
[1] Assay    Sample   Genotype Data    
<0 rows> (or 0-length row.names)

[[2]]
     Assay Sample Genotype Data
5 CCT6-002   0050        G    0
6 CCT6-002   0050        G    0

[[3]]
     Assay Sample Genotype Data
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]]
      Assay Sample Genotype Data
3  CCT6-002   1997        G    0
4  CCT6-002   1997     <NA>   NA
9  CCT6-015   0121        G    0
10 CCT6-015   0121     <NA>   NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多