DF
av bv tv u l value s
30 120 360 330 210 6600 0.005238424
35 125 360 325 200 6875 0.005028887
40 130 360 320 190 7150 0.004835468
45 135 360 315 180 7425 0.004656377
50 140 360 310 170 7700 0.004490078
55 145 360 305 160 7975 0.004335247
60 150 360 300 150 8250 0.004190739
65 155 360 295 140 8525 0.004055554
70 160 360 290 130 8800 0.003928818
75 165 360 285 120 9075 0.003809763
80 170 360 280 110 9350 0.003697711
dput(DF)
df<-structure(list(av = c(30, 35, 40, 45, 50, 55, 60, 65, 70, 75,
80), bv = c(120, 125, 130, 135, 140, 145, 150, 155, 160, 165,
170), tv = c(360, 360, 360, 360, 360, 360, 360, 360, 360, 360,
360), u = c(330, 325, 320, 315, 310, 305, 300, 295, 290, 285,
280), l = c(210, 200, 190, 180, 170, 160, 150, 140, 130, 120,
110), value = c(6600, 6875, 7150, 7425, 7700, 7975, 8250, 8525,
8800, 9075, 9350), s = c(0.005238424, 0.00502888704, 0.00483546830769231,
0.00465637688888889, 0.00449007771428572, 0.00433524744827586,
0.0041907392, 0.00405555406451613, 0.003928818, 0.00380976290909091,
0.00369771105882353)), .Names = c("av", "bv", "tv", "u", "l",
"value", "s"), row.names = c(1L, 13L, 25L, 37L, 49L, 61L, 73L,
85L, 97L, 109L, 121L), class = "data.frame")
DF2
av bv tv u l value
30 120 0 0 0 0
30 120 20 0 0 0
30 120 40 10 0 550
30 120 60 30 0 1650
30 120 120 90 0 4950
30 120 180 150 30 6600
dput(DF2)
df2<-structure(list(av = c(30, 30, 30, 30, 30, 30), bv = c(120, 120,
120, 120, 120, 120), tv = c(0, 20, 40, 60, 120, 180), u = c(0,
0, 10, 30, 90, 150), l = c(0, 0, 0, 0, 0, 30), value = c(0, 0,
550, 1650, 4950, 6600)), .Names = c("av", "bv", "tv", "u", "l",
"value"), row.names = c(1L, 2602L, 5203L, 7804L, 10405L, 13006L
), class = "data.frame")
我想要做的就是将df$s
中的df
值添加到df2
df$bv == df2$bv
。 df2
bv
中的df
值会更多,因此会有一些重复的s
值。
我正在尝试以下
newDF <- ddply(df2, .(bv,tv), summarise, s = df[df$bv %in% df2$bv,]$s)
虽然这对我不起作用,但也许是因为我并不真正理解这个函数中的变量参数。
此时所有其他列都是任意的,但我希望保持整个数据帧完整。
答案 0 :(得分:7)
这会将'df'中对应的's'项目拉入匹配的'df2'行:
df2$s <- df$s[ match(df2$bv, df$bv)]
df2
#-----------------------
av bv tv u l value s
1 30 120 0 0 0 0 0.005238424
2602 30 120 20 0 0 0 0.005238424
5203 30 120 40 10 0 550 0.005238424
7804 30 120 60 30 0 1650 0.005238424
10405 30 120 120 90 0 4950 0.005238424
13006 30 120 180 150 30 6600 0.005238424
这比'subset()' - ting和'merge()' - 更有效。 Oooops。我没有看到plyr部分。它也会比任何plyr方法快得多,但那就是因为'我是一个基础R家伙。如果你想用plyr做,那么这就是我认为你要求的:
> newDF <- ddply(df2, .(bv), summarise, s = df$s[match(df2$bv , df$bv)])
> newDF
bv s
1 120 0.005238424
2 120 0.005238424
3 120 0.005238424
4 120 0.005238424
5 120 0.005238424
6 120 0.005238424
答案 1 :(得分:4)
虽然问题已经得到解答,但我认为我会使用data.table
包给您一个不同的方法解决这个问题。
library(data.table)
df <- data.table(df)
setkey(df, bv)
df2 <- data.table(df2)
setkey(df2, bv)
df2[df, roll = T]
我想你的完整数据集比这个简单的例子大得多,所以你可能会在data.table
上获得更好的表现。
> system.time(df2[df, roll = T])
user system elapsed
0.007 0.000 0.008
> system.time(ddply(df2, .(bv), summarise, s = df$s[match(df2$bv , df$bv)]))
user system elapsed
0.013 0.001 0.065
答案 2 :(得分:1)
dfsub<-data.frame(bv=df$bv,s=df$s)
newdf<-merge(df2,dfsub,by="bv",all=TRUE)
如果您不希望添加df
中未出现在df2
中的额外值,请删除all=TRUE
,例如
newdf<-merge(df2,dfsub,by="bv")
修改
在我的情况下,那就是:
df2sub<-data.frame(bv=df2$bv)
dfsub<-data.frame(bv=df$bv,s=df$s)
newdf<-merge(df2sub,dfsub,by="bv")
newdf
bv s
1 120 0.005238424
2 120 0.005238424
3 120 0.005238424
4 120 0.005238424
5 120 0.005238424
6 120 0.005238424