R 如何匹配和划分
鉴于以下数据表:R 如何匹配和划分,r,data.table,R,Data.table,鉴于以下数据表: df1 <- data.table(V1=c("A","C","D","B"),V2=c(0,2,0,2),V3=c(2,0,2,0)) df2 <- data.table(V1=c("A","B","C","D"),V2=c(4,2,4,2)) df1 df2 > df1 V1 V2 V3 1: A 0 2 2: C 2 0 3: D 0 2 4: B 2 0 > df2 V1 V2 1: A 4 2: B
df1 <- data.table(V1=c("A","C","D","B"),V2=c(0,2,0,2),V3=c(2,0,2,0))
df2 <- data.table(V1=c("A","B","C","D"),V2=c(4,2,4,2))
df1
df2
> df1
V1 V2 V3
1: A 0 2
2: C 2 0
3: D 0 2
4: B 2 0
> df2
V1 V2
1: A 4
2: B 2
3: C 4
4: D 2
你能帮帮我吗
非常感谢。带有
数据。表
:
setkey(df1, V1)
df1[df2,.(V1,V2=V2/i.V2, V3=V3/i.V2)]
# V1 V2 V3
#1: A 0.0 0.5
#2: B 1.0 0.0
#3: C 0.5 0.0
#4: D 0.0 1.0
有关更多选项,请参见注释。带有
数据。表
:
setkey(df1, V1)
df1[df2,.(V1,V2=V2/i.V2, V3=V3/i.V2)]
# V1 V2 V3
#1: A 0.0 0.5
#2: B 1.0 0.0
#3: C 0.5 0.0
#4: D 0.0 1.0
有关更多选项,请参见注释。这将适用于您的示例,尽管它不能扩展到更多列。您的实际使用是否使用两个具有相同列名的表
df3<-merge(df1,df2,"V1")[,list(V2=V2.x/V2.y, V3=V3/V2.y),by=V1]
这将适用于您的示例,尽管它不能扩展到更多的列。您的实际使用是否使用两个具有相同列名的表
df3<-merge(df1,df2,"V1")[,list(V2=V2.x/V2.y, V3=V3/V2.y),by=V1]
我添加了
data.table
标记,因为您正在使用此包创建代码。下次别忘了添加标签,以便让关注您的帖子的超级用户(不仅仅是他们)能够看到您的帖子。我已经添加了data.table
标签,因为您正在使用此软件包创建代码。下次别忘了添加标签,以使您的帖子对关注它的超级用户(不仅仅是他们)可见。df1[df2,(V2=V2/i.V2,V3=V3/i.V2),by=.EACHI]
或df1[df2,(V1,V2=V2/i.V2,V3=V3/i.V2)]
无需使用by=.EACHI
,也首选通过引用分配,我会选择df1[df2,`:=`(V2=V2/i.V2,V3=V3/i.V2)]
@davidernburg是的,但这修改了df1
,这可能不是我们想要的。@Frank我读到OP想要通过一个键将df1
中的任何值与df2
中相应的值进行匹配。这听起来就像左连接,所以我看不到创建df3
的理由,因为df1
中的所有值都可能是潜在的如果需要,我会保留。df1[df2,(V2=V2/i.V2,V3=V3/i.V2),by=.EACHI]
或df1[df2,(V1,V2=V2/i.V2,V3=V3/i.V2)]
不需要在by=.EACHI
中,也首选通过引用赋值,我会选择df1[df2,`=`(V2=V2/i.V2,V3=i.V2)]
@davidernburg是的,但这修改了df1
,这可能不是我们想要的。@Frank我读到OP想要通过一个键将df1
中的任何值与df2
中相应的值进行匹配。这听起来就像左连接,所以我看不到创建df3
的理由,因为df1
中的所有值都可能是潜在的在扩展性方面,总是有一些东西像merge(df1,df2,“V1”)[,lapply(.SD[,!“V2.y”,with=FALSE],`/`,V2.y),by=V1]
@Frank我用另一种方式写了这篇文章,它允许更多的专栏,我看到…有太多的东西需要我仔细研究,以判断哪种方式更为一般。我怀疑你关于制作临时专栏的代码评论可以用.SD[,!“V2.y”,with=FALSE]这样的方式来表达
但我可能错了。而且,.SD/x
据我所知强制使用matrix。@Frank前6行只是更改了名称,这样如果有共同的名称,它们就不再是了,所以你几乎可以忽略它们。@Frank我听取了你关于如何删除temp列的建议。我还删除了对yV1
A的引用就可扩展性而言,总有一些东西像merge(df1,df2,“V1”)[,lapply(.SD[,!“V2.y”,with=FALSE],`/`,V2.y),by=V1]
@Frank我用另一种方式写了这篇文章,它允许更多的专栏,我看到…有太多的东西需要我仔细研究,以判断哪种方式更为一般。我怀疑你关于制作临时专栏的代码评论可以用.SD[,!“V2.y”,with=FALSE]这样的方式来表达
但我可能是错的。而且,.SD/x
据我所知强制使用matrix。@Frank前6行只是更改了名称,这样如果有共同的名称,它们就不再是了,所以你几乎可以忽略它们。@Frank我听取了你关于如何删除temp列的建议。我还删除了对yV1