将值插入R data.frame中的列

时间:2013-11-03 08:52:28

标签: r dataframe

我是R的新手并且遇到了以下问题。 我的数据框看起来就是这样。

    >   Entity  Substance conc..mM. variable value
    1     STD5    Sulfate     5.000     Area 70761
    2     STD5    Formate     5.000     Area    NA
    3     STD5    Acetate     5.000     Area 70777
    4     STD5    Lactate     5.000     Area 74329
    5     STD5 Propionate     5.000     Area 84198
    6     STD5   Butyrate     5.000     Area 91598
    7     STD5  Valeriate        NA     Area 40609
    8     STD5   Caproate        NA     Area 40763
    9   STD2_5    Sulfate     2.500     Area 34350
    10  STD2_5    Formate     2.500     Area    NA
    11  STD2_5    Acetate     2.500     Area 34863
    12  STD2_5    Lactate     2.500     Area 36262
    13  STD2_5 Propionate     2.500     Area 41849
    14  STD2_5   Butyrate     2.500     Area 44574
    15  STD2_5  Valeriate     2.500     Area 39664
    16  STD2_5   Caproate     2.500     Area 39867

现在我想添加一个列,其中给定实体的每一行都包含来自相应实体的caproate值。 有没有明智的方法来实现这一目标?

预期输出

    >   Entity  Substance conc..mM. variable value area caproate
    1     STD5    Sulfate     5.000     Area 70761   40763
    2     STD5    Formate     5.000     Area    NA   40763 
    3     STD5    Acetate     5.000     Area 70777   40763
    4     STD5    Lactate     5.000     Area 74329   40763
    5     STD5 Propionate     5.000     Area 84198   40763
    6     STD5   Butyrate     5.000     Area 91598   40763
    7     STD5  Valeriate        NA     Area 40609   40763
    8     STD5   Caproate        NA     Area 40763   40763
    9   STD2_5    Sulfate     2.500     Area 34350   39867
    10  STD2_5    Formate     2.500     Area    NA   39867
    11  STD2_5    Acetate     2.500     Area 34863   39867
    12  STD2_5    Lactate     2.500     Area 36262   39867
    13  STD2_5 Propionate     2.500     Area 41849   39867
    14  STD2_5   Butyrate     2.500     Area 44574   39867
    15  STD2_5  Valeriate     2.500     Area 39664   39867
    16  STD2_5   Caproate     2.500     Area 39867   39867

2 个答案:

答案 0 :(得分:2)

有两种选择:

使用plyr

library(plyr)
ddply(dat,.(Entity), transform,newv=value[Substance =="Caproate"])

或者如果您有大量数据,请使用data.table

library(data.table)
DT <- as.data.table(dat)
DT[,newv:=value[Substance =="Caproate"],by=Entity]

答案 1 :(得分:0)

使用R基函数ave

> dat$area_caproate <- with(dat, ave(value, Entity, FUN=function(x) na.omit(x[Substance=="Caproate"])))
> dat
   Entity  Substance conc..mM. variable value area_caproate
1    STD5    Sulfate       5.0     Area 70761         40763
2    STD5    Formate       5.0     Area    NA         40763
3    STD5    Acetate       5.0     Area 70777         40763
4    STD5    Lactate       5.0     Area 74329         40763
5    STD5 Propionate       5.0     Area 84198         40763
6    STD5   Butyrate       5.0     Area 91598         40763
7    STD5  Valeriate        NA     Area 40609         40763
8    STD5   Caproate        NA     Area 40763         40763
9  STD2_5    Sulfate       2.5     Area 34350         39867
10 STD2_5    Formate       2.5     Area    NA         39867
11 STD2_5    Acetate       2.5     Area 34863         39867
12 STD2_5    Lactate       2.5     Area 36262         39867
13 STD2_5 Propionate       2.5     Area 41849         39867
14 STD2_5   Butyrate       2.5     Area 44574         39867
15 STD2_5  Valeriate       2.5     Area 39664         39867
16 STD2_5   Caproate       2.5     Area 39867         39867