如何使用plyr处理data.frame中的多列数据

时间:2014-11-19 17:28:17

标签: r

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

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的colname是由机器记录的不同热处理持续时间的热流,ascast1~ascast5表示没有对样品进行任何检查以检查机器的准确性。

现在我需要做以下事情:

  1. 对于T1~T2以摄氏度为单位,我需要将它们改为开尔文度,这意味着每个数据加上273.16。

  2. 选择两个温度来比较Ts = 180.25,Te = 240.45的结果(所有这些都用Celsius Degrees讨论,我已经看到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

  3. Ts中的所有热流应该是相同的,为方便起见可以为0。因此,基于不同时间的不同值的热流,如0.5min,1min,2min,4min,8min,10min,20min和ascas1~ascast5,所有热流值应该减去Ts中的热流值。

    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)
      
    2. 实际上,[0.05700000 - ( - 0.01710000)]已在步骤2中完成,但我将其写入供您参考。该公式用于不同的T1~T12和列,如(T1,0.5min),(T2,1min),(T3,1min)......均为12对。

      1. 现在我们可以在同一幅度上绘制12对数据,间隔为180~240(也是摄氏度),以放大DSC不同扫描之间差异的细节。
      2. 我已经坚持这个问题2天了,所以我回到stackoverflow寻求帮助。

        谢谢!

1 个答案:

答案 0 :(得分:1)

我假设你的问题在开头遇到了以下错误,

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

因为我在其他步骤中找不到问题。它们看起来像是一个实验的循序渐进的过程。

要解决这个错误,问题是列名中有一个数字,所以要按照你想要的方式使用列名(引用一列),你应该使用“`”,重音符号,符号。 / p>

>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

根据评论添加更多信息,

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

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