我真的很新R,所以我很抱歉,如果我没有完全理解。
我有一个DF,在几个不同的区域收集数据,称为STAND。我需要为从1:3运行的数据创建一个序列,但是当涉及新的STAND编号时必须重新启动序列。
这是一些虚拟数据
STAND TREE_SPECIES DIAMETER
1 101737 Pine 276
2 101737 Spruce 98
3 101737 Spruce 104
4 101737 Leaf 53
5 155897 Spruce 82
6 155897 Spruce 61
7 155897 Leaf 97
8 155897 Spruce 89
9 155897 Spruce 75
10 202568 Spruce 46
11 202568 Spruce 56
12 202568 Pine 204
13 202568 Spruce 132
14 202568 Spruce 93
我希望它看起来像这样:
STAND TREE_SPECIES DIAMETER SEQ
1 101737 Pine 276 1
2 101737 Spruce 98 2
3 101737 Spruce 104 3
4 101737 Leaf 53 1
5 155897 Spruce 82 1
6 155897 Spruce 61 2
7 155897 Leaf 97 3
8 155897 Spruce 89 1
9 155897 Spruce 75 2
10 202568 Spruce 46 1
11 202568 Spruce 56 2
12 202568 Pine 204 3
13 202568 Spruce 132 1
14 202568 Spruce 93 2
如果有任何帮助,我的DF总共有7416行,分为90个STANDS。
到目前为止,我已经尝试过:
myDF$SEQ <- seq(1:3)
但是在整个df中仅列出1:3。
非常感谢你的帮助!
答案 0 :(得分:1)
试试这个:
df$SEQ <- ave(x = df$STAND, df$STAND, FUN = function(y) rep(1:3, length.out = length(y)))
或更短,但结果相同,如果您可以使用警告信息,因为沿着每个STAND的长度循环1:3序列 - 长度不一定是1:3长度的倍数:< / p>
df$SEQ2 <- ave(df$STAND, df$STAND, FUN = function(y) 1:3)
结果:
df
# STAND TREE_SPECIES DIAMETER SEQ SEQ2
# 1 101737 Pine 276 1 1
# 2 101737 Spruce 98 2 2
# 3 101737 Spruce 104 3 3
# 4 101737 Leaf 53 1 1
# 5 155897 Spruce 82 1 1
# 6 155897 Spruce 61 2 2
# 7 155897 Leaf 97 3 3
# 8 155897 Spruce 89 1 1
# 9 155897 Spruce 75 2 2
# 10 202568 Spruce 46 1 1
# 11 202568 Spruce 56 2 2
# 12 202568 Pine 204 3 3
# 13 202568 Spruce 132 1 1
# 14 202568 Spruce 93 2 2
ave
将x
向量(此处为:STAND)拆分为由下一个(未命名)参数(此处为STAND)的级别定义的片段。应用于FUN
中每个部分的默认函数ave
为mean
。在这里,我们将该函数更改为“匿名函数”function(y)
,我们将其定义为rep(1:3, length.out = length(y))
。 'y'对应于每个部分。您可以使用任何选择的名称替换“y”(例如function(chunk) rep(1:3, length.out = length(chunk))
。您会看到人们经常使用function(x)
,但我不想使用'x'作为每个部分的名称这里因为'x'也被用作整个向量的ave
中的参数。对于每一个,rep
将值1:3转换为所需的长度(length.out
),即每件作品的长度:length(y)