如何配分
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)
给定以下数据 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)