【问题标题】:Assign a vector to a variable based on criteria根据条件将向量分配给变量
【发布时间】:2018-01-17 22:55:27
【问题描述】:
  top5 <- ifelse(state = "PA", c("Oranges", "Bananas", "Avocados", "Tomatoes", "Cucumbers"),
             ifelse(state = "MA"), c("Oranges", "Bananas", "Peaches", "Leaves", "Cucumbers"),
             ifelse(state = "ME"), c("Oranges", "Bananas", "Avocados", "Tomatoes", "Watermelon"),
             ifelse(state = "NH"), c("Tea", "Bananas", "Avocados", "Tomatoes", "Cucumbers"),
             ifelse(state = "RI"), c("Oranges", "Coconuts", "Avocados", "Tomatoes", "Cucumbers"),
             ifelse(state = "VT"), c("Carrots", "Bananas", "Apples", "Tomatoes", "Cucumbers"))

以上是我目前所拥有的。我想根据函数的输入分配相应的向量。我将它放在一个函数中,尽管即使在函数之外我也无法让它工作。谢谢。

响应答案,这是很好的解决方案。但是,我希望将这些向量之一传递到基于标准的变量中,但这是行不通的。

我需要这样做的原因是稍后调用该向量,以通过与该状态匹配的相应向量过滤该状态的数据。

例如 PA 的前五种水果是:“橙子”、“香蕉”、“鳄梨”、“西红柿”、“黄瓜”。如果函数需要 PA,我需要将其分配给变量,以便该函数稍后可以将数据过滤到仅这些水果。这是我的完整代码:

FruitAnalyses <- function(statefile,state) 
top5 <- ifelse(state = "PA", c("Oranges", "Bananas", "Avocados", "Tomatoes", "Cucumbers"),
         ifelse(state = "MA"), c("Oranges", "Bananas", "Peaches", "Leaves", "Cucumbers"),
         ifelse(state = "ME"), c("Oranges", "Bananas", "Avocados", "Tomatoes", "Watermelon"),
         ifelse(state = "NH"), c("Tea", "Bananas", "Avocados", "Tomatoes", "Cucumbers"),
         ifelse(state = "RI"), c("Oranges", "Coconuts", "Avocados", "Tomatoes", "Cucumbers"),
         ifelse(state = "VT"), c("Carrots", "Bananas", "Apples", "Tomatoes", "Cucumbers"))

  statefile <- fread(paste0(state,"_fruit.csv"), header = T, data.table = F, 
stringsAsFactors = F, na.strings = c(",,",""," ")) 
#Lower names and convert to tbl
names(statefile) <- tolower(names(statefile))
statefile <- as.tbl(statefile)
#Parse Month and Year into single string - This is for later use when 
dates <-mdy(statefile$fruitstartdate)
statefile <- statefile %>%
 mutate(Month = month(dates, label = T))
rm(dates) 
statefileGrouped <- statefile %>%
  filter(priorfruitgroup %in% top5) %>%
  group_by(priorfruitgroup, Month) %>%
   summarise(TotalSeriousFruit = sum(seriousfruit),
            TotalFruitCount = sum(fruit)) %>%
  arrange(Month)
fwrite(statefileGrouped,file=paste0(state,".csv"))
barplot <- ggplot(statefileGrouped, aes(x=Month, y=Totalfruitcount, 
   fill=TotalotherfruitCount)) +
  geom_bar(color="black",stat="identity") +
  facet_grid(.~priorfruitgroup)
return(barplot)
}

忽略变量名称的差异,出于保密原因,我不得不更改一些名称。然而,这不是问题的主要主题。我想知道为什么 top5 不会根据标准正确分配给向量。

【问题讨论】:

  • 我认为一个可能的解决方案是将所有内容分组到列表中,然后将其调用到我的变量中:top5

标签: r if-statement


【解决方案1】:

比起使用ifelse,我可能会选择switch函数:

states <- c('PA', 'MA', 'ME', 'NH', 'RI', 'VT')

sapply(states, function(x){
  switch(x,
         PA = c("Oranges", "Bananas", "Avocados", "Tomatoes", "Cucumbers"),
         MA = c("Oranges", "Bananas", "Peaches", "Leaves", "Cucumbers"),
         ME = c("Oranges", "Bananas", "Avocados", "Tomatoes", "Watermelon"),
         NH = c("Tea", "Bananas", "Avocados", "Tomatoes", "Cucumbers"),
         RI = c("Oranges", "Coconuts", "Avocados", "Tomatoes", "Cucumbers"),
         VT = c("Carrots", "Bananas", "Apples", "Tomatoes", "Cucumbers"))
})

     PA          MA          ME           NH          RI          VT         
[1,] "Oranges"   "Oranges"   "Oranges"    "Tea"       "Oranges"   "Carrots"  
[2,] "Bananas"   "Bananas"   "Bananas"    "Bananas"   "Coconuts"  "Bananas"  
[3,] "Avocados"  "Peaches"   "Avocados"   "Avocados"  "Avocados"  "Apples"   
[4,] "Tomatoes"  "Leaves"    "Tomatoes"   "Tomatoes"  "Tomatoes"  "Tomatoes" 
[5,] "Cucumbers" "Cucumbers" "Watermelon" "Cucumbers" "Cucumbers" "Cucumbers"

可以如下操作:

xx <- sapply(states, function(x){
  switch(x,
         PA = c("Oranges", "Bananas", "Avocados", "Tomatoes", "Cucumbers"),
         MA = c("Oranges", "Bananas", "Peaches", "Leaves", "Cucumbers"),
         ME = c("Oranges", "Bananas", "Avocados", "Tomatoes", "Watermelon"),
         NH = c("Tea", "Bananas", "Avocados", "Tomatoes", "Cucumbers"),
         RI = c("Oranges", "Coconuts", "Avocados", "Tomatoes", "Cucumbers"),
         VT = c("Carrots", "Bananas", "Apples", "Tomatoes", "Cucumbers"))
})

apply(t(xx), 1, paste, collapse = ', ')

                                                PA 
 "Oranges, Bananas, Avocados, Tomatoes, Cucumbers" 
                                                MA 
    "Oranges, Bananas, Peaches, Leaves, Cucumbers" 
                                                ME 
"Oranges, Bananas, Avocados, Tomatoes, Watermelon" 
                                                NH 
     "Tea, Bananas, Avocados, Tomatoes, Cucumbers" 
                                                RI 
"Oranges, Coconuts, Avocados, Tomatoes, Cucumbers" 
                                                VT 
   "Carrots, Bananas, Apples, Tomatoes, Cucumbers" 

【讨论】:

    【解决方案2】:

    或者,您可以使用列表。

    my.list <- list("PA"=c("Oranges", "Bananas", "Avocados", "Tomatoes", "Cucumbers"),
                    "MA"=c("Oranges", "Bananas", "Peaches", "Leaves", "Cucumbers"),
                    "ME"= c("Oranges", "Bananas", "Avocados", "Tomatoes", "Watermelon"),
                    "NH"=c("Tea", "Bananas", "Avocados", "Tomatoes", "Cucumbers"),
                    "RI"=c("Oranges", "Coconuts", "Avocados", "Tomatoes", "Cucumbers"),
                    "VT"=c("Carrots", "Bananas", "Apples", "Tomatoes", "Cucumbers"))
    

    然后可以这样访问:

    my.list$NH
    [1] "Tea"       "Bananas"   "Avocados"  "Tomatoes"  "Cucumbers"
    

    或:

    x <- 'PA'
    my.list[[x]]
    

    使用变量时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 2017-09-22
      • 2020-02-19
      • 2021-06-22
      • 2014-05-11
      • 1970-01-01
      相关资源
      最近更新 更多