R-根据两个条件从另一个数据帧添加数据

R-根据两个条件从另一个数据帧添加数据,r,replace,R,Replace,我试图根据两个匹配条件将数据从另一个数据帧添加到另一个数据帧 第一个数据帧如下所示: df.1<-cbind.data.frame(c("Site A","Site A","Site A","Site A","Site B","Site B","Site B","Site C","Site C"),c("Species 1","Species 2","Species 3","Species 5","Species 2","Species 3","Species 4","Species 1"

我试图根据两个匹配条件将数据从另一个数据帧添加到另一个数据帧

第一个数据帧如下所示:

df.1<-cbind.data.frame(c("Site A","Site A","Site A","Site A","Site B","Site B","Site B","Site C","Site C"),c("Species 1","Species 2","Species 3","Species 5","Species 2","Species 3","Species 4","Species 1","Species 5"),c(10,15,5,10,30,10,20,10,5))
names(df.1)<-c("Location","Species","Count")
我的第二个数据帧是:

df.2<-as.data.frame(matrix(0,nrow=3,ncol=5))
names(df.2)<-c("Species 1","Species 2","Species 3","Species 4","Species 5")
row.names(df.2)<-c("Site A","Site B","Site C")
我想根据位置和种类将第一个数据帧的计数添加到第二个数据帧。应该是这样的:

       Species 1  Species 2  Species 3 Species 4 Species 5
Site A  10         15         5         0         10
Site B  0          30         10        20        0
Site C  10         0          0         0         15
但我似乎做不到。问题似乎在于两个数据帧的大小不同

也就是说,我试过:

df.2<-ifelse(row.names(df.2)==df.1$Location && names(df.2)==df.1$Species,df.1$Count,0)

df.2您不需要第二个数据帧,只需将
Species
列扩展为宽格式,例如使用
tidyr

library(tidyr)
df.1 %>%
   spread(Species, Count) %>%
   mutate_all(funs(replace(., is.na(.), 0)))


  Location Species 1 Species 2 Species 3 Species 4 Species 5
1   Site A        10        15         5         0        10
2   Site B         0        30        10        20         0
3   Site C        10         0         0         0         5

mutate\u all
函数将
spread
引入的所有
NA
替换为零。

您不需要第二个数据帧,只需将
物种
列扩展为宽格式,例如使用
tidyr

library(tidyr)
df.1 %>%
   spread(Species, Count) %>%
   mutate_all(funs(replace(., is.na(.), 0)))


  Location Species 1 Species 2 Species 3 Species 4 Species 5
1   Site A        10        15         5         0        10
2   Site B         0        30        10        20         0
3   Site C        10         0         0         0         5
mutate\u all
函数将
spread
引入的所有
NA
替换为零。

或w/base R

tapply(df.1$Count,list(df.1$Location,df.1$Species),"[")

       Species 1 Species 2 Species 3 Species 4 Species 5
Site A        10        15         5        NA        10
Site B        NA        30        10        20        NA
Site C        10        NA        NA        NA         5
如果你不想要NAs

df[is.na(df)] <- 0
df[is.na(df)]或w/base R

tapply(df.1$Count,list(df.1$Location,df.1$Species),"[")

       Species 1 Species 2 Species 3 Species 4 Species 5
Site A        10        15         5        NA        10
Site B        NA        30        10        20        NA
Site C        10        NA        NA        NA         5
如果你不想要NAs

df[is.na(df)] <- 0

df[is.na(df)]我们可以使用
xtabs
from
base R

xtabs(Count ~ Location +Species, df.1)
#       Species
#Location Species 1 Species 2 Species 3 Species 4 Species 5    
#  Site A        10        15         5         0        10
#  Site B         0        30        10        20         0
#  Site C        10         0         0         0         5

我们可以使用
xtabs
from
base R

xtabs(Count ~ Location +Species, df.1)
#       Species
#Location Species 1 Species 2 Species 3 Species 4 Species 5    
#  Site A        10        15         5         0        10
#  Site B         0        30        10        20         0
#  Site C        10         0         0         0         5