将匹配列从一个csv文件添加到另一个csv文件并在列之间相乘

时间:2015-04-16 04:22:42

标签: r

我有两个单独的csv文件 1. 15列和2500行 2. 3列150行。 这两个表都有一个共同的列名。我想将csv文件1的列添加到csv 2,但只根据公共列名和值匹配记录,然后将csv 1文件的每一列与csv 2列相乘,并编写一个单独的csv文件。数据和结果如下:

CSV 1:

Wavelength     Spec1      Spec2     Spec3     Spec4

461            0.031162   0.02928   0.025156  0.028369
462            0.031452   0.028441  0.024456  0.028587
463            0.03145    0.02857   0.024519  0.028295
464            0.031333   0.029298  0.025012  0.02806
465            0.031426   0.02948   0.024909  0.02872
466            0.031602   0.029342  0.025329  0.028861
467            0.031521   0.029108  0.025481  0.028738
468            0.031123   0.029013  0.024849  0.028731
469            0.031609   0.029285  0.025036  0.028567
470            0.031695   0.029543  0.025357  0.028627
471            0.031134   0.029535  0.025374  0.028931
472            0.031587   0.029106  0.02503   0.028847

CSV 2:

Wavelength   SpecR    Stdv
462          0.883542 0.010013
463          0.877453 0.011648
464          0.881011 0.011571
465          0.874721 0.009472
466          0.879688 0.006468
467          0.886569 0.004118
468          0.891913 0.003214
469          0.88768  0.002561

输出1

Wavelength  SpecR    Stdv     Spec1    Spec2    Spec3    Spec4
462         0.883542 0.010013 0.031452 0.028441 0.024456 0.028587
463         0.877453 0.011648 0.03145  0.02857  0.024519 0.028295
464         0.881011 0.011571 0.031333 0.029298 0.025012 0.02806
465         0.874721 0.009472 0.031426 0.02948  0.024909 0.02872
466         0.879688 0.006468 0.031602 0.029342 0.025329 0.028861
467         0.886569 0.004118 0.031521 0.029108 0.025481 0.028738
468         0.891913 0.003214 0.031123 0.029013 0.024849 0.028731
469         0.88768  0.002561 0.031609 0.029285 0.025036 0.028567

输出2:

Wavelength SpecR    Spec1    Spec2    Spec3    Spec4
462        0.883542 0.02779  0.025129 0.021608 0.025258
463        0.877453 0.027596 0.025069 0.021515 0.024828
464        0.881011 0.027605 0.025812 0.022036 0.024721
465        0.874721 0.027489 0.025787 0.021788 0.025122
466        0.879688 0.0278   0.025811 0.022282 0.025388
467        0.886569 0.027946 0.025806 0.022591 0.025478
468        0.891913 0.027759 0.025877 0.022163 0.025625
469        0.88768  0.028058 0.025995 0.022224 0.025358

我可以组合csv表,但我不知道如何附加我需要的数据。感谢

csv1 <- read.table('spectral1.csv', header=TRUE,sep=',')
csv2 <- read.table('spectral2.csv', header=TRUE,sep=',')

1 个答案:

答案 0 :(得分:2)

要将您的csv1数据框加入csv2 {J} output1,您可以使用merge() ...更多关于加入{{3} }}

output1 <- merge(csv2, csv1, by = "Wavelength", all.x = TRUE) 

#   Wavelength    SpecR     Stdv    Spec1    Spec2    Spec3    Spec4
# 1        462 0.883542 0.010013 0.031452 0.028441 0.024456 0.028587
# 2        463 0.877453 0.011648 0.031450 0.028570 0.024519 0.028295
# 3        464 0.881011 0.011571 0.031333 0.029298 0.025012 0.028060
# 4        465 0.874721 0.009472 0.031426 0.029480 0.024909 0.028720
# 5        466 0.879688 0.006468 0.031602 0.029342 0.025329 0.028861
# 6        467 0.886569 0.004118 0.031521 0.029108 0.025481 0.028738
# 7        468 0.891913 0.003214 0.031123 0.029013 0.024849 0.028731
# 8        469 0.887680 0.002561 0.031609 0.029285 0.025036 0.028567

要将列与特定列相乘...让我们说SpecR来获取output2数据框,您可以使用transform()然后排除第三列,如果您需要:

output2 <- transform(output1, 
                     Spec1 = Spec1 * SpecR,
                     Spec2 = Spec2 * SpecR,
                     Spec3 = Spec3 * SpecR,
                     Spec4 = Spec4 * SpecR )[,-3] 

#   Wavelength    SpecR      Spec1      Spec2      Spec3      Spec4
# 1        462 0.883542 0.02778916 0.02512882 0.02160790 0.02525782
# 2        463 0.877453 0.02759590 0.02506883 0.02151427 0.02482753
# 3        464 0.881011 0.02760472 0.02581186 0.02203585 0.02472117
# 4        465 0.874721 0.02748898 0.02578678 0.02178843 0.02512199
# 5        466 0.879688 0.02779990 0.02581181 0.02228162 0.02538868
# 6        467 0.886569 0.02794554 0.02580625 0.02259066 0.02547822
# 7        468 0.891913 0.02775901 0.02587707 0.02216315 0.02562555
# 8        469 0.887680 0.02805868 0.02599571 0.02222396 0.02535835

但是如果您的列数变化,您可以朝这个方向做点什么,在第三个列之后包含所有列:

output2 <- cbind(output1$Wavelengt, output1$SpecR, output1[, -c(1:3)] * output1$SpecR) 

甚至更简单,直接在output1上执行此操作:

output1[, -c(1:3)] <- (output1[, -c(1:3)] * output1$SpecR)

然后再次排除Stdv列,如果需要的话。这将产生与上述转换相同的结果。