我必须在此数据集 (dat) 上进行一组随天而变的选择,该数据集由物种 (sp)、天 (天,在 POSIXct 中) 和面积 (ar) 组成:
sp day ar
A 1-Jan-00 2
B 1-Jan-00 6
C 2-Jan-00 2
A 2-Jan-00 1
D 2-Jan-00 4
E 2-Jan-00 12
F 3-Jan-00 8
A 4-Jan-00 3
G 4-Jan-00 2
B 4-Jan-00 1
我需要对物种“A”出现的位置进行子集化。但是,要选择的区域会因天而异,由该矩阵 (dat.ar) 给出:
day ar.select
1-Jan-00 (1,6)
2-Jan-00 (1,12)
3-Jan-00 (4,8)
4-Jan-00 (3,12)
更具体地说,对于物种“A”出现的区域,在 00 年 1 月 1 日,我只需要区域 1 和 6。对于 00 年 2 月,区域 1 和 12,依此类推。作为示例,此示例的此选择所需的输出如下所示:
sp day ar
A 2-Jan-00 1
A 4-Jan-00 3
我在获得 for 循环方面没有取得多大成功,因为我仍在尝试学习 R 中的语义。总而言之,对必须做什么有一个粗略的想法,但仍在努力学习该语言。这是我认为应该去哪里的草图:
dat1 = with(dat,sapply(day[sp=="A" & dat.ar$day.s[i] ],
function(x) ar == (ar[sp=="A" & day == x]==dat.ar$ar.select[j])
final=dat[rowSums(dat1) > 0, ]
我相信我必须适合一个 for 循环,它将通过 dat.ar,指定要在 dat 中选择的区域。但是,尽管我努力尝试 for 循环,但我还没有接近。我什至不确定结合 sapply 和 for 循环是否是解决此问题的正确方法。如果有人希望重现该问题:
sp=c("A","B","C","A","D","E","F","A","G","B")
day=c("1-Jan-00", "1-Jan-00", "2-Jan-00", "2-Jan-00", "2-Jan-00",
"2-Jan-00", "3-Jan-00", "4-Jan-00", "4-Jan-00", "4-Jan-00")
day=as.POSIXct(day, format="%d-%b-%y")
ar=c(2,6,2,1,4,12,8,3,2,1)
dat= as.data.frame(cbind(sp, day, ar))
day.s=c("1-Jan-00", "2-Jan-00", "3-Jan-00", "4-jan-00")
day.s=as.POSIXct(day.s, format="%d-%b-%y")
a.s=c(1,1,4,3)
a.e=c(6,12,8,12)
ar.select=paste(a.s, a.e, sep=",")
dat.ar=cbind(day.s, ar.select)
任何帮助深表感谢。