使用另一个数据帧的行中的值替换一个数据帧的列中的所有值(按行名称和列名称匹配)

时间:2017-04-20 14:58:46

标签: r replace

我有一个数据框,它是在不同位置发现的物种存在缺失矩阵(1表示存在,0表示不存在),如下所示:

df1<-data.frame(replicate(5,sample(0:1,5,rep=TRUE)))
row.names(df1)<-c("location.1","location.2","location.3","location.4","location.5")
names(df1)<-c("species.1","species.2","species.3","species.4","species.5") 

           species.1 species.2 species.3 species.4 species.5
location.1         0         1         0         1         1
location.2         1         0         0         1         0
location.3         0         0         1         0         0
location.4         1         0         1         0         1
location.5         0         0         1         0         0

我有第二个数据框,其中包含每个物种的值,如下所示:

df2<-c(2,4,6,8,10)
df2<-as.matrix(df2)
row.names(df2)<-c("species.1","species.2","species.3","species.4","species.5")

          [,1]
species.1    2
species.2    4
species.3    6
species.4    8
species.5   10

我希望逐个列地替换第一个数据帧中的所有1,并根据物种名称替换第二个数据帧中的匹配值。制作这个:

           species.1 species.2 species.3 species.4 species.5
location.1         0         4         0         8        10 
location.2         2         0         0         8         0
location.3         0         0         6         0         0
location.4         2         0         6         0        10
location.5         0         0         6         0         0

我不知道我是如何做到这一点的,并且无法在线找到任何类似的例子。

有人有任何建议吗?

1 个答案:

答案 0 :(得分:0)

我们可以通过以下其中一个选项来完成此操作

 df1*df2[,1][col(df1)]

在这里,我们将第一个数据集与&#39; df2&#39;的第一列相乘。复制使长度相同

或另一个选项是sweep,其中包含MARGINSTATSFUN参数,可以在列的相应元素上应用函数(MARGIN = 1行)

 sweep(df1, 2, df2[,1], "*")

或者我们可以使用mapply循环遍历列并乘以向量的相应元素&#39; df2 [,1]`

 mapply("*", df1, df2[,1])