我有两个data.frame
,df
和wf
。
df
每个id
的每个时间点都有一行。每个tpoint
都缺少一些时间点(id
)。
我的第二个data.frame
,wf
,每个tpoint
分别有id
和spoint
的开始和结束epoint
。
所以我想在df
填写遗失的tpoints
中缺少的行。以下是data.frames
df <- read.table(text= "id Gid tpoint dat1 dat2 dat3
1 a 1 x x 55
1 a 3 x x 44
1 a 4 x x 33
2 a 2 x x 66
2 a 3 x x 43
3 b 4 x x 42
3 b 5 x x 36
4 b 4 x x 33
4 b 5 x x 65
4 b 6 x x 77
5 b 4 x x 72
5 b 5 x x 25
5 b 6 x x 12
5 b 7 x x 09",header=TRUE)
wf <- read.table(text= "id Gid spoint epoint
1 a 1 5
2 a 1 4
3 b 4 6
4 b 4 7
5 b 4 7",header=TRUE)
我想出了一种方法,可以在下面执行此操作:
library(plyr)
seqlist <- apply(wf, 1, function(x) data.frame( id=x[1],
Gid=x[2],
tpoint = seq(x[3], x[4])))
# bunch of warnings but I get the result
seqdf <- ldply(seqlist, data.frame)
finaldf <- merge(seqdf, df, by=c("Gid", "id", "tpoint"), all=TRUE)
虽然我得到了我想去的地方,但我得到了一堆丑陋的警告。但我猜所有警告都应该被禁止。在R
中有无限的方法给猫皮肤。有没有更好的方法可以做到这一点我失踪了?
答案 0 :(得分:1)
错误的发生是因为:
apply()
的调用中,数据帧被强制转换为数组,在本例中为字符数组)要删除警告,请尝试以下操作:
seqlist <- apply(wf, 1, function(x){
n <- as.numeric(x[4])-as.numeric(x[3])+1
data.frame( id=rep(x[1], n), Gid=rep(x[2], n), tpoint = x[3]:x[4])
})
seqlist
[[1]]
id Gid tpoint
1 1 a 1
2 1 a 2
3 1 a 3
4 1 a 4
5 1 a 5
[[2]]
id Gid tpoint
1 2 a 1
2 2 a 2
3 2 a 3
4 2 a 4
[[3]]
id Gid tpoint
1 3 b 4
2 3 b 5
3 3 b 6
[[4]]
id Gid tpoint
1 4 b 4
2 4 b 5
3 4 b 6
4 4 b 7
[[5]]
id Gid tpoint
1 5 b 4
2 5 b 5
3 5 b 6
4 5 b 7