【问题标题】:How to process multi columns data in data.frame with plyr如何使用 plyr 处理 data.frame 中的多列数据
【发布时间】:2014-11-19 17:28:17
【问题描述】:

我正在尝试用 R 解决 DSC(差示扫描量热法)数据,但似乎遇到了一些麻烦。在我的实验室里,这一切过去都是在 Origin 或 Qtiplot 中繁琐地完成的。但我想知道是否有另一种方法可以批量完成。但结果并不顺利。例如,也许我使用了我的 data.frame 的错误名称,代码

dat$0.5min
Error: unexpected numeric constant in "dat$0.5"

无法访问我的数据。

所以下面是我的目的的完整描述,提前谢谢你!

DSC数据是这样的(我把CSV文件存到我的GoogleDrive Link) :

T1      0.5min      T2      1min    
40.59   -0.2904 40.59   -0.2545
40.81   -0.281  40.81   -0.2455
41.04   -0.2747 41.04   -0.2389
41.29   -0.2728 41.29   -0.2361
41.54   -0.2553 41.54   -0.2239
41.8    -0.07   41.8    -0.0732
42.06   0.1687  42.06   0.1414
42.32   0.3194  42.32   0.2817
42.58   0.3814  42.58   0.3421
42.84   0.3863  42.84   0.3493
43.1    0.3665  43.11   0.3322
43.37   0.3438  43.37   0.3109
43.64   0.3265  43.64   0.2937
43.9    0.3151  43.9    0.2819
44.17   0.3072  44.17   0.2735
44.43   0.2995  44.43   0.2656
44.7    0.2899  44.7    0.2563
44.96   0.2779  44.96   0.245

事实上,我已经将数据合并到一个 data.frame 中,希望我可以调整它并做进一步的事情。 命令是:

dat<-read.csv("Book1.csv",header=F)
colnames(dat)<-c('T1','0.5min','T2','1min','T3','2min','T4','4min','T5','8min','T6','10min',
             'T7','20min','T8','ascast1','T9','ascast2','T10','ascast3','T11','ascast4',
             'T12','ascast5'
             )

所以实际上 dat 是一个具有 1163 obs 的 data.frame。 24 个变量。

T1,T2,T3.....T12 是指样品进行 DSC 测试的温度,尽管在相同的时间间隔内,由于机器的不稳定性,它们确实略有不同。

T1~T12 的列名是机器记录的不同热处理时间的 Heat Flow,ascast1~ascast5 表示没有对样品做任何检查机器的精度。

现在我需要执行以下操作:

  1. 因为T1~T2是摄氏度,我需要把它们换成开尔文度数,即每条数据加273.16。

  2. 选择两个温度来比较结果,即 Ts=180.25,Te=240.45(均以摄氏度讨论,我已经看过 Qtiplot 以确保)。为了清楚起见,我列出了两个温度和前 6 列数据。

    T1 0.5min T2 1min T3 2min T4 4min

    180.25 -0.01710000 180.25 -0.01780000 180.25 -0.02120000 180.25 -0.02020000

    。 . . .

    。 . . .

    240.45 0.05700000 240.45 0.04500000 240.45 0.05780000 240.45 0.05580000

Ts 中的所有热流应该是相同的,为了方便可以设为 0。所以根据0.5min、1min、2min、4min、8min、10min、20min、ascas1~ascast5等不同时间的Heat Flow值的不同,所有Heat Flow值都应该减去Ts中的Heat Flow值。

  1. 对于以 Te 为单位的热流,应调整该值以确保所有以 Te 为单位的热流数据相同。目的如下,(1)计算Te中12个热流数据的平均值。让我们使用 Hmean 作为平均热流。所以 Hmean 是所有热流应该是的值。 (2)对于0.5min列的数据,我用col("0.5min")表示,线性变换公式如下:

      col("0.5min")-[([0.05700000-(-0.01710000)]-Hmean)/(Te-Ts)]*(col(T1)-Ts)
    

其实 [0.05700000-(-0.01710000)] 是在第 2 步完成的,但我写出来供大家参考。这个公式用于不同的T1~T12对和列,如(T1,0.5min),(T2,1min),(T3,1min).....都是12对。

  1. 现在我们可以将 12 对数据以 180~240 的间隔(也以摄氏度为单位)绘制在同一个图上,以放大 DSC 不同扫描之间差异的细节。

我被这个问题困扰了 2 天,所以我返回 stackoverflow 寻求帮助。

谢谢!

【问题讨论】:

  • 到底是什么问题?您不能在开始时引用所述列吗?还是您提到的 4 个步骤之一有问题?
  • 抱歉没有及时回复?这确实是我的问题之一。以下步骤的详细描述是寻求在 R 中快速完成的任何建议和 cmets?例如,当我阅读 plyr 示例时,我发现了很多关于如何根据名称处理数据的建议,但是如果需要处理的列太多,如何处理它们?我的意思是使用列名作为索引不是那么明智吗?

标签: r


【解决方案1】:

我假设您的问题在一开始就出现了以下错误,

dat$0.5min
Error: unexpected numeric constant in "dat$0.5"

因为我在其余步骤中找不到问题。它们就像一个实验的一步一步的过程。

要修复该错误,问题是列名中有一个数字,因此要以您想要的方式使用列名(引用列),您应该使用“`”、重音符号、符号。

>dataF <- data.frame("0.5min"=1:10,"T2"=11:20,check.names = F)
> dataF$`0.5min`
 [1]  1  2  3  4  5  6  7  8  9 10

基于cmets添加更多信息,

您可以通过以下方式添加常量以添加到备用列,

dataF <- data.frame(matrix(1:100,10,10))
const <- 237

> print(dataF)
   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1   1 11 21 31 41 51 61 71 81  91
2   2 12 22 32 42 52 62 72 82  92
3   3 13 23 33 43 53 63 73 83  93
4   4 14 24 34 44 54 64 74 84  94
5   5 15 25 35 45 55 65 75 85  95
6   6 16 26 36 46 56 66 76 86  96
7   7 17 27 37 47 57 67 77 87  97
8   8 18 28 38 48 58 68 78 88  98
9   9 19 29 39 49 59 69 79 89  99
10 10 20 30 40 50 60 70 80 90 100

dataF[,seq(1,ncol(dataF),by = 2)] <- dataF[,seq(1,ncol(dataF),by = 2)] + const

> print(dataF)
    X1 X2  X3 X4  X5 X6  X7 X8  X9 X10
1  238 11 258 31 278 51 298 71 318  91
2  239 12 259 32 279 52 299 72 319  92
3  240 13 260 33 280 53 300 73 320  93
4  241 14 261 34 281 54 301 74 321  94
5  242 15 262 35 282 55 302 75 322  95
6  243 16 263 36 283 56 303 76 323  96
7  244 17 264 37 284 57 304 77 324  97
8  245 18 265 38 285 58 305 78 325  98
9  246 19 266 39 286 59 306 79 326  99
10 247 20 267 40 287 60 307 80 327 100

概括地说,我们知道数据框的列可以用数字/列名的向量来引用。 R 中的大多数操作都是矢量化的。您可以根据要查找的模式使用列名或编号。

例如,我更改了前两列的名称,并且只想访问我这样做的那些,

colnames(dataF)[c(1,2)] <- c("Y1","Y2")

#Reference all column names with "Y" in it. You can do any operation you want on this.
dataF[,grep("Y",colnames(dataF))]

   Y1 Y2
1  238 11
2  239 12
3  240 13
4  241 14
5  242 15
6  243 16
7  244 17
8  245 18
9  246 19
10 247 20

【讨论】:

  • 哦,谢谢你的帮助。是的,这是我的问题之一。真的很有帮助。
  • 但实际上,我还是有问题。根据我的 CSV 数据文件格式,我没有看到任何快速的方法来完成我的任务。例如,如何将 273 添加到 col1,3,5,7 而不是有效地使用 R 中的 2,4,6?天真地,我争辩说循环判断col数的奇数或偶数,但它看起来像一个C程序?有cmets吗?谢谢!
  • 太棒了!优秀的解决方案!谢谢!
  • 真的很有帮助!
  • 赞成/接受就足够了。不需要谢我 :)。对于第二个问题,请查看 aes() 中的填充选项。或者看看这是否有帮助,stackoverflow.com/questions/17303573/… 它可以让您将它们堆叠或将它们分组等...
猜你喜欢
  • 1970-01-01
  • 2014-01-30
  • 2022-11-21
  • 1970-01-01
  • 2011-04-23
  • 2020-09-28
  • 1970-01-01
  • 2016-11-19
  • 2013-11-21
相关资源
最近更新 更多