2017-04-20 45 views
0

我有一个数据帧,其是在不同的位置发现的物种的存在不存在基质(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

尝试'DF1 * DF2 [1 ] [col(df1)]'或'sweep(df1,2,df2 [,1],“*”)'或'mapply(“*”,df1,df2 [,1])' – akrun

+0

非常感谢所有工作都完美无瑕(不敢相信它如此简单,您应该看到我为此编写的代码!) –

+0

谢谢。我发表了我的评论作为解决方案。你也可以勾选[here](http://stackoverflow.com/help/someone-answers) – akrun

回答

0

我们可以通过其中一个选项下方

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

这里做到这一点,我们乘用的“DF2”第一列的第一个数据集的复制,使相同长度


或者另一个选项是sweep其中有MARGINSTATSFUN自变量将该功能应用于列的相应元素(MARGIN = 1在行上)

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

或者,我们可以使用mapply遍历的列和由矢量的DF2的相应元素”乘以[1]`

mapply("*", df1, df2[,1]) 
相关问题