Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用R中的公共行划分两个数据帧_R - Fatal编程技术网

用R中的公共行划分两个数据帧

用R中的公共行划分两个数据帧,r,R,我有两个数据集 > df2<-data.frame(name=c("A","B","C"),F1=c(5,8,9),F2=c(3,8,9),F3=c(1,2,3)) name F1 F2 F3 1 A 5 3 1 2 B 8 8 2 3 C 9 9 3 > df1<-data.frame(name=c("C","C","A&

我有两个数据集

> df2<-data.frame(name=c("A","B","C"),F1=c(5,8,9),F2=c(3,8,9),F3=c(1,2,3))
  name F1 F2 F3
1    A  5  3  1
2    B  8  8  2
3    C  9  9  3
> df1<-data.frame(name=c("C","C","A","B"),F1=c(1,5,8,9),F2=c(1,5,8,9),F3=c(1,5,8,9))
  name F1 F2 F3
1    C  1  1  1
2    C  5  5  5
3    A  8  8  8
4    B  9  9  9

>df2 df1请注意,如果任何真实数据的名称包含
“.x”
“.y”
,则此操作无效


我们可以对
数据使用join和divide.table

library(data.table)
nm1 <- names(df1)[-1]
nm2 <- paste0('i.', nm1)
setDT(df1)[df2, (nm1) := Map(`/`, mget(nm1), mget(nm2)), on = .(name)]
df1
#   name        F1        F2        F3
#1:    C 0.1111111 0.1111111 0.3333333
#2:    C 0.5555556 0.5555556 1.6666667
#3:    A 1.6000000 2.6666667 8.0000000
#4:    B 1.1250000 1.1250000 4.5000000
库(data.table)

nm1这是一个基本的R解决方案:

ind = match(df1$name, df2$name)
data.frame("name" = df1$name, df1[,-1] / df2[ind,-1])

#   name        F1        F2        F3
# 1    C 0.1111111 0.1111111 0.3333333
# 2    C 0.5555556 0.5555556 1.6666667
# 3    A 1.6000000 2.6666667 8.0000000
# 4    B 1.1250000 1.1250000 4.5000000

如果将
/
替换为
*
@TanyaValkanova Yes,则所有这些解决方案都可以用于乘法,只要将
/
替换为
*
ind = match(df1$name, df2$name)
data.frame("name" = df1$name, df1[,-1] / df2[ind,-1])

#   name        F1        F2        F3
# 1    C 0.1111111 0.1111111 0.3333333
# 2    C 0.5555556 0.5555556 1.6666667
# 3    A 1.6000000 2.6666667 8.0000000
# 4    B 1.1250000 1.1250000 4.5000000