【问题标题】:Do if then statement based on values inside data frame or vector根据数据框或向量中的值执行 if then 语句
【发布时间】:2019-06-03 23:32:29
【问题描述】:

举个例子,假设我有这个数据:

key <- data.frame(num=c(1,2,3,4,5), month=c("January", "Feb", "March", "Apr", "May"))
data <- c(4,2,5,3)

我想使用 key 中包含的 nummonth 的映射创建一个新向量 data2。我可以使用case_when 手动执行此操作,一次执行大量 if 语句:

library(dplyr)
data2<-case_when(
    data==1 ~ "January",
    data==2 ~ "Feb",
    data==3 ~ "March",
    data==4 ~ "Apr",
    data==5 ~ "May"
)

但是,假设我想自动化这个过程(也许我实际上有数千个 if 语句)并利用 key 中包含的映射。这或类似的东西,可能吗?

这是一次失败的代码尝试:

data2 <- case_when(data=key$num ~ key$month)

我要的是一个名为data2 的向量,其中包含以下元素:c("Apr","Feb","May","March")。我该怎么做?

【问题讨论】:

  • 我确信有一种方法可以使用 case_when 来实现,但这可以通过子集来完成 - 例如 key$month[match(data, key$num)]
  • data2 &lt;- data.frame(num = data) %&gt;% left_join(key) %&gt;% pull(month)。 (你可能想用stringsAsFactors = F 加载key
  • 理想情况下,它会使用case_when,这样我就可以用一个函数来做到这一点。我问的真正原因与这个问题有关:stackoverflow.com/questions/56411936/… 请参阅我对答案的评论。希望这些答案之一可以适用于那里。

标签: r if-statement logic


【解决方案1】:

您可以使用match 和基本 R 索引(也可以在初始化 data.frame 时设置 stringsAsFactors=FALSE,如下所示):

key <- data.frame(num=c(1,2,3,4,5), month=c("January", "Feb", "March", "Apr", "May"), stringsAsFactors = FALSE)
data2 <- key$month[match(data, key$num)]
data2
#[1] "Apr"   "Feb"   "May"   "March"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2011-08-15
    • 2017-09-06
    • 1970-01-01
    • 2021-02-17
    • 2011-08-20
    相关资源
    最近更新 更多