我有一个数据框,它是在不同位置发现的物种存在缺失矩阵(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
我不知道我是如何做到这一点的,并且无法在线找到任何类似的例子。
有人有任何建议吗?
答案 0 :(得分:0)
我们可以通过以下其中一个选项来完成此操作
df1*df2[,1][col(df1)]
在这里,我们将第一个数据集与&#39; df2&#39;的第一列相乘。复制使长度相同
或另一个选项是sweep
,其中包含MARGIN
,STATS
和FUN
参数,可以在列的相应元素上应用函数(MARGIN = 1
行)
sweep(df1, 2, df2[,1], "*")
或者我们可以使用mapply
循环遍历列并乘以向量的相应元素&#39; df2 [,1]`
mapply("*", df1, df2[,1])