我有一个有趣的,我认为应该是一个简单的问题。问题是如何根据另一列中的数字或日期顺序分配分类变量。
数据是一段时间内的样本点数据。在若干年的过程中,已经多次测量了相同的点。我想为每个采样点分配值T1,T2,T3等,T1为第一次测量,T2为第二次测量,依此类推每个点。
如果数据是例如:
df <- data.frame(Point = factor(c("A", "A", "B", "B", "C", "D", "E", "E", "E")),
Date = c("20140404", "20161002", "20150217", "20170101", "20130508",
"20130514", "20131024", "20150412", "20170210"),
Data = c(10, 5, 5, 3, 2, 7, 8, 5, 6))
数据框看起来像:
Point Date Data
1 A 20140404 10
2 A 20161002 5
3 B 20150217 5
4 B 20170101 3
5 C 20130508 2
6 D 20130514 7
7 E 20131024 8
8 E 20150412 5
9 E 20170210 6
最终结果将是:
Point Date Data Time
1 A 20140404 10 T1
2 A 20161002 5 T2
3 B 20150217 5 T1
4 B 20170101 3 T2
5 C 20130508 2 T1
6 D 20130514 7 T1
7 E 20131024 8 T2
8 E 20150412 5 T3
9 E 20170210 6 T1
我确信这可以使用for循环完成,其中:
for (i in df$Point {
df$Time <-
}
但我不知道如何让R为最低df $ Date添加T1,为下一个添加T2等等。
任何帮助表示感谢。
答案 0 :(得分:1)
你可以这样做:
df$Time <- paste0("T", ave(df$Data, df$Point, FUN=seq_along))
输出:
print(df)
Point Date Data Time
1 A 20140404 10 T1
2 A 20161002 5 T2
3 B 20150217 5 T1
4 B 20170101 3 T2
5 C 20130508 2 T1
6 D 20130514 7 T1
7 E 20131024 8 T1
8 E 20150412 5 T2
9 E 20170210 6 T3
假设您对Date列进行了排序(就像您在示例中所示的那样)。
ave
函数在因子的级别组合上对FUN(在这种情况下为seq_along
)进行分组。
seq_along
生成常规序列。
有关详细信息,请参阅R帮助文档页面:
?ave
?seq_along