【问题标题】:Extracting data (or reshaping) a data frame from an existing data frame in R从 R 中的现有数据框中提取数据(或重塑)数据框
【发布时间】:2011-12-05 15:44:02
【问题描述】:

我有一个正在使用的大型数据框,前几行如下:

      Assay   Genotype   Sample    Result
1     001        G         1         0
2     001        A         2         1
3     001        G         3         0 
4     001        NA        4         NA
5     002        T         1         0
6     002        G         2         1
7     002        T         3         0 
8     002        T         4         0
9     003        NA        1         N
10    003        G         2         1
11    003        G         3         1 
12    003        T         4         0

我总共将处理 2000 个样本和每个样本的 168 个检测。对于每个样本,我想为每个样本提取“结果”中的数据,以创建如下所示的列表或数据框:

Sample  Data
   1    00N
   2    111
   3    001
   4    N00

因此,生成的数据帧(或类似的首选数据结构)将是 2000 行和 2 列。 'Data' 行将包含 168 个字符,每个字符对应于每个 'Assay'。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 第 4 行有轻微的错字吗?应该改为 NA00 吗?
  • 我实际上更喜欢将最终字符串的“N​​A”缩短为 N。如果它更容易,我可以忍受它。
  • 一个简单的答案是gsub("NA", "N", yourData)
  • @Chase 当我在我的数据帧上运行 gsub 时,我得到了我不知道如何使用的数据格式。在 cmets 中发布这里太长了,但它似乎将我的数据框分成了两个不同的字符列表。你能告诉我如何维护我的数据框结构并仍然进行这些更改吗?
  • 查看我编辑的答案,结合@Brian 的观点和上面关于 gsub 的一点。干杯。

标签: r dataframe


【解决方案1】:

使用包plyr 和基本函数paste 的一种方法:

library(plyr)
ddply(dat, "Sample", summarize, Data = paste(Result, collapse = ""))

  Sample Data
1      1  00N
2      2  111
3      3  001
4      4 NA00

编辑以解决问题

我能想到的将 NA 更改为 N 的最简单方法可能是在 ddply 的结果上使用 gsub。请注意,我大量借用了@Brian re 提供的非常好的观点:订购。这样做,这是一个很好的提示!

out <- ddply(dat, "Sample", summarize, Data = paste(Result[order(Assay)], collapse = ""))

然后使用gsub

out$Data <- gsub("NA", "N", out$Data)

瞧:

  Sample Data
1      1  00N
2      2  111
3      3  001
4      4  N00

【讨论】:

    【解决方案2】:

    使用splitsapply 的基础R 解决方案:

    sapply(split(dat$Result, dat$Sample), paste, collapse="")
    
         1      2      3      4 
     "00N"  "111"  "001" "NA00" 
    

    【讨论】:

      【解决方案3】:

      请注意,@Chase 和@Andrie 都假设数据已经按分析排序(您的示例是这样,所以不是一个不合理的假设)。如果不是,您仍然可以按正确的顺序获取字符串。

      适应@Chase 的解决方案

      library(plyr)
      ddply(dat, "Sample", summarize, 
        Data = paste(Result[order(Assay)], collapse = ""))
      

      给予

        Sample Data
      1      1  00N
      2      2  111
      3      3  001
      4      4 NA00
      

      如果我们使用未排序的数据:

      dat.scramble <- dat[sample(nrow(dat)),]
      
      > dat.scramble
         Assay Genotype Sample Result
      6    002        G      2      1
      1    001        G      1      0
      3    001        G      3      0
      7    002        T      3      0
      10   003        G      2      1
      8    002        T      4      0
      12   003        T      4      0
      5    002        T      1      0
      2    001        A      2      1
      4    001       NA      4     NA
      9    003       NA      1      N
      11   003        G      3      1
      

      我们仍然得到相同的结果

      ddply(dat.scramble, "Sample", summarize, 
        Data = paste(Result[order(Assay)], collapse = ""))
      
        Sample Data
      1      1  00N
      2      2  111
      3      3  001
      4      4 NA00
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-06
        • 2014-03-10
        • 1970-01-01
        • 1970-01-01
        • 2017-02-11
        相关资源
        最近更新 更多