添加一个标识个人的新列

时间:2013-03-07 00:03:56

标签: r

我的数据集包括每个人的三种治疗方法(C,S和E)。看起来像这样。

    Year   Cultivar   Site   Distance   Plant   Treat    yield1   yield2
1   2011   Blue       ABR    0m         1       C        0.879    1.5
2   2011   Blue       ABR    0m         1       S        0.384    2.3
3   2011   Blue       ABR    0m         1       E        0.03     0.5
4   2011   Blue       ABR    0m         2       C        0.923    1.2
5   2011   Blue       ABR    0m         2       S        0.344    0.5
6   2011   Blue       ABR    0m         2       E        0.07     0.7
7   2011   Blue       ABR    50m        1       C        0.255    3.4
8   2011   Blue       ABR    50m        1       S        1.00     2.4
9   2011   Blue       ABR    50m        1       E        0.1      0.9
.
.
.

我有两年的数据,2个品种,15个地点,每个地点3个距离,每个距离10个植物。基本上我有很多数据(> 1400行)。我希望能够做的是添加一个新列,为整个研究中的每个人分配一个新数字。我希望我的数据最终看起来像这样。

    Individual  Year   Cultivar   Site   Distance   Plant   Treat    yield1   yield2
1   1           2011   Blue       ABR    0m         1       C        0.879    1.5
2   1           2011   Blue       ABR    0m         1       S        0.384    2.3
3   1           2011   Blue       ABR    0m         1       E        0.03     0.5
4   2           2011   Blue       ABR    0m         2       C        0.923    1.2
5   2           2011   Blue       ABR    0m         2       S        0.344    0.5
6   2           2011   Blue       ABR    0m         2       E        0.07     0.7
7   3           2011   Blue       ABR    50m        1       C        0.255    3.4
8   3           2011   Blue       ABR    50m        1       S        1.00     2.4
9   3           2011   Blue       ABR    50m        1       E        0.1      0.9
.
.
.

我对R来说比较新,所以如果这是相对容易做的话,我道歉。我知道我应该能够“找到”每个人作为植物*距离*网站*品种*年的独特组合,但我老实说我不知道​​如何编写这个,我还没有找到任何类似的帮助页面。

任何建议都将不胜感激!

4 个答案:

答案 0 :(得分:4)

以下是使用plyr的解决方案:

library(plyr)
df$id <- id(df[c("Year","Cultivar", "Site", "Distance", "Plant")], drop=TRUE) 
#Add whichever columns contain the unique combination you require
df

 Year Cultivar Site Distance Plant Treat yield1 yield2 id
1 2011     Blue  ABR       0m     1     C  0.879    1.5  1
2 2011     Blue  ABR       0m     1     S  0.384    2.3  1
3 2011     Blue  ABR       0m     1     E  0.030    0.5  1
4 2011     Blue  ABR       0m     2     C  0.923    1.2  2
5 2011     Blue  ABR       0m     2     S  0.344    0.5  2
6 2011     Blue  ABR       0m     2     E  0.070    0.7  2
7 2011     Blue  ABR      50m     1     C  0.255    3.4  3
8 2011     Blue  ABR      50m     1     S  1.000    2.4  3
9 2011     Blue  ABR      50m     1     E  0.100    0.9  3

答案 1 :(得分:4)

使用data.table

.GRP解决方案
  

.GRP是一个整数,长度为1,包含一个简单的组计数器。第1组为1,第2组为2,等等。

library(data.table)
DT <- data.table(df)

DT[,grp :=.GRP,by = list(Year,Cultivar, Site, Distance, Plant)]

答案 2 :(得分:2)

不使用额外包裹的解决方案:

df$id <- factor(apply(df[,c("Year","Cultivar", "Site", "Distance", "Plant")], 1, paste, collapse=""))
levels(df$id) <- 1:length(levels(df$id))

答案 3 :(得分:1)

这不是最好的解决方案,而是解决方案:

library(qdap)
df$id <- as.numeric(factor(paste2(df[qcv(terms="Year Cultivar Site Distance Plant")])))