【问题标题】:Create and assign multiple new dataframe columns in ifelse statement?在 ifelse 语句中创建并分配多个新的数据框列?
【发布时间】:2018-10-13 16:34:27
【问题描述】:

所以我有一个数据框my_df如下

my_df <- data.frame(c("0600", "0602", "0603"))

现在我需要编写 ifelse 语句来计算另外 3 个变量并将其附加到一个新的数据帧中。

我不知道如何在循环中添加多个可执行语句并将计算的变量附加到新的数据框。

下面是我的ifelse 语句代码。

with(my_df, ifelse(my_df$H == "0600",{d$D <- 1+1 & d$c <- "0600"},
    ifelse(my_df$H == "0602",{d$D <- 2+1 & d$c <- "0602"},
        { d$D <- 3+1 & d$c <- "0603"}
)))

我可以在ifloop 内仅使用一个可执行代码将值附加到新数据帧,即如果我只有{d$D &lt;- 1+1},它可以完美运行,但当我有多个要执行的语句时会失败。

我的输出数据框应该如下图,

D    C
2    0600
3    0602
4    0603

【问题讨论】:

  • ifelse() 是一个函数。 ...并且您没有保存函数的结果。
  • @jogo 是的,我知道。那么你会建议我做哪些改变才能让它发挥作用呢?
  • 仅供参考,当您使用 with(df,...) 时,您不需要重新调用 df 来调用其变量,即 with(df, ifelse(H == ...))...

标签: r if-statement dataframe dplyr


【解决方案1】:

ifelse 的语法已关闭,但我建议在此处使用 dplyr 库中的 case_when

library(dplyr)
d$D <- case_when(
    my_df$H == "0600" ~ 1+1,
    my_df$H == "0602" ~ 2+1,
    TRUE ~ 3+1
)

d$c <- case_when(
    my_df$H == "0600" ~ "0600",
    my_df$H == "0602" ~ "0602",
    TRUE ~ "0603"
)

您也可以使用ifelse,但您需要对ifelse 进行嵌套调用,而且它可能看起来不太好,或者很难维护。

【讨论】:

  • 我尝试复制您的解决方案,它非常适合所提出的问题,但这是我的疑问。我还尝试添加一个方程来代替 my_df$H == "0600" ~ 1+1 行中的算术运算,我将其替换为 my_df$H == "0600" ~ substr(my_df$H,1,3) 行。这不起作用,你能告诉我我哪里出错了。
  • @ANmike 你应该问一个新问题。我的猜测是 API 不允许函数调用作为谓词,但你可以很容易地解决这个问题。
  • 对不起,我会发布一个新问题。
【解决方案2】:

使用列表:

# My data frame
my_df <- data.frame(H = c("0600", "0602", "0603"))

# My list to be used as a lookup
my_list <- list("0600" = c(D = 2, C = "0600"),
                "0602" = c(D = 3, C = "0602"),
                "0604" = c(D = 4, C = "0603"))

# Find corresponding values for 'H' 
# Then bind into a data frame
do.call(bind_rows, my_list[my_df$H])

结果:

# A tibble: 3 x 2
#   D     C    
# <chr> <chr>
# 1 2     0600 
# 2 3     0602 
# 3 4     0603 

【讨论】:

    【解决方案3】:

    使用基础 R

    my_df <- data.frame("C" = c("0600", "0602", "0603"))
    my_df$D  <- ifelse(my_df$C=="0600",2,ifelse(my_df$C=="0602",3,ifelse(my_df$C=="0603",4,NA)))
    

    【讨论】:

    • 投反对票的人,如果你能解释为什么投反对票,我很感激。
    • 我反驳了你的反对意见,但很可能他的原因是,虽然你的回答在技术上完全符合 OP 的要求,但进行大型嵌套 ifelse 调用并不是最佳编码实践。
    • @jogo 从技术上讲,根据 OP 输出,我的代码是唯一包含 C 和 D 的输出。
    • @TimBiegeleisen 感谢您的善意行动和建议。但是 OP 要求嵌套 ifelse。
    • 我明白这一点,但下次请记住,SO 也是关于 best 的答案,而不仅仅是 OP 要求的。举个例子,人们经常要求使用正则表达式解决方案来解析 HTML 和 XML,我们不鼓励这样做。
    猜你喜欢
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2015-06-25
    相关资源
    最近更新 更多