基于行匹配填充列而不使用for循环

时间:2018-03-21 01:45:08

标签: r dataframe subset

有没有办法在不使用for循环的情况下根据州,物种和年份获得年度计数值?

Name    |  State   |  Age  | Species    | Annual Ct
Nemo    |  NY      |  5    | Clownfish  | ?
Dora    |  CA      |  2    | Regal Tang | ?

查找表:

State |  Species    | Year  | AnnualCt
NY    |  Clownfish  |  2012 |  500
NY    |  Clownfish  |  2014 |  200
CA    |  Regal Tang |  2001 |  400
CA    |  Regal Tang |  2014 |  680
CA    |  Regal Tang |  2000 |  700

输出结果为:

Name  |  State |  Age | Species    | Annual Ct
Nemo  |  NY    |  5   | Clownfish  | 200
Dora  |  CA    |  2   | Regal Tang | 680

我尝试过的事情:

pets <- data.frame("Name" = c("Nemo","Dora"), "State" = c("NY","CA"),
               "Age" = c(5,2), "Species" = c("Clownfish","Regal Tang"))
fishes <- data.frame("State" = c("NY","NY","CA","CA","CA"), 
                  "Species" = c("Clownfish","Clownfish","Regal Tang", 
                                "Regal Tang", "Regal Tang"),
                  "Year" = c("2012","2014","2001","2014","2000"),
                  "AnnualCt" = c("500","200","400","680","700"))

pets["AnnualCt"] <- NA

for (row in (1:nrow(pets))){
pets$AnnualCt[row] <- as.character(droplevels(fishes[which(fishes$State == pets[row,]$State & 
                                   fishes$Species == pets[row,]$Species & 
                                   fishes$Year == 2014), 
                           which(colnames(fishes)=="AnnualCt")]))
}

1 个答案:

答案 0 :(得分:2)

我对你要做的事感到困惑;这不是这个吗?

library(dplyr);
left_join(pets, fishes) %>%
    filter(Year == 2014) %>% 
    select(-Year);
#Joining, by = c("State", "Species")
#  Name State Age    Species AnnualCt
#1 Nemo    NY   5  Clownfish      200
#2 Dora    CA   2 Regal Tang      680

说明:left_join data.frameState Speciesfilter Year == 2014Year列输出{{1}}