【问题标题】:R, sapply(), function, and if/else problemR、sapply()、函数和 if/else 问题
【发布时间】:2021-11-17 00:36:52
【问题描述】:

我必须对整个列进行操作。 我需要一列中每一行的值“x”为:

  • 如果 x
  • 如果 x > 364,那么 5,
  • 如果不满足这些条件,我需要将 5 乘以另一列中与 x 相同行位置的值。

我的操作结构是这样的:

rel$recentness_new <- sapply(rel$`Recentness data (# days)`, function(x) if (x < 42) {
  0
} else if (x > 364) {
    5
} else {
  rel$recentness_relative[x] * 5
})

你可以想象到第二个 if 之前一切都很好,然后我得到奇怪的值作为输出。 我不知道如何告诉 R 乘以同一行中的值,但在函数内的另一列中!

【问题讨论】:

  • 这似乎是 data.table::fcase 或 dplyr::case_when 的一个很好的用例
  • 至于使用供应,您需要沿着 seq_along(column) 循环以获得索引 ii;在前两个分支中使用 column[ii],在第三个分支中使用 relative[ii]。

标签: r function if-statement sapply


【解决方案1】:

ifelse() 可以同时处理一整列,您可以将它们堆叠起来,例如:

set.seed(1)
a <- runif(n = 100, min = 0, max = 400)
b <- rep(2, 100)
df <- data.frame(a,b)

df$c <- ifelse(df$a < 42, 0, ifelse(df$a > 364, 5, df$b * 5))
head(df)
#>           a b  c
#> 1 106.20347 2 10
#> 2 148.84956 2 10
#> 3 229.14135 2 10
#> 4 363.28312 2 10
#> 5  80.67277 2 10
#> 6 359.35587 2 10
Created on 2021-09-23 by the reprex package (v2.0.1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多