如何配分

How to match and divide

给定以下数据 tables:

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

我寻求以下内容:对于df1的每个数值,将此值除以df2的相应值,使用V1作为键。结果数据 table 应该是:

> df3
   V1 V2   V3
1:  A  0    0.5
2:  C  0.5  0
3:  D  0    1
4:  B  1    0

你能帮帮我吗?

非常感谢。

data.table:

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

查看评论了解更多选项。

这将适用于您的示例,尽管它不太可扩展到更多列。您的实际使用情况是否使用两个具有相同列名的 table?

df3<-merge(df1,df2,"V1")[,list(V2=V2.x/V2.y, V3=V3/V2.y),by=V1]

这是一种适用于更多列的方法,即使它们在每个 table 中的名称可能相同也可能不同。这依赖于要匹配的列被命名为 V1 但除此之外它不依赖于列名。即使 df2 中有超过 2 列,它也会将 V1 之后的第一列作为除数。

#The first six lines just change column names incase they're the same
oldnames1<-names(df1)[!names(df1) %in% "V1"]
oldnames2<-names(df2)[!names(df2) %in% "V1"]
newnames1<-paste0("x",oldnames1)
newnames2<-paste0("y",oldnames2)
setnames(df1,oldnames1,newnames1)
setnames(df2,oldnames2,newnames2)
df3<-merge(df1,df2,by="V1")
df3[,(oldnames1):=.SD[,!..newnames2]/get(newnames2),by="V1"]
df3[,c(newnames1,newnames2):=NULL]
setnames(df1,newnames1,oldnames1)
setnames(df2,newnames2,oldnames2)