【问题标题】:Using a loop to define values of case_when in R使用循环在 R 中定义 case_when 的值
【发布时间】:2018-10-08 18:24:23
【问题描述】:

我目前正在使用case_when 在我的数据中定义一个新变量:

data[,46] <- NA

data[,46] <- case_when(
   data[,35] ==  1 ~ data[,36],
   data[,35] ==  2 ~ data[,37],
   data[,35] ==  3 ~ data[,38],
   data[,35] ==  4 ~ data[,39],
   data[,35] ==  5 ~ data[,40],
   data[,35] ==  6 ~ data[,41],
   data[,35] ==  7 ~ data[,42],
   data[,35] ==  8 ~ data[,43],
   data[,35] ==  9 ~ data[,44],
   data[,35] ==  10 ~ data[,45]
)

我正在尝试编写一个循环来提高此功能的效率,但遇到了一些麻烦。这是我尝试过的:

for (j in 1:10) {
data[,46] <- case_when(
   data[,35] ==  j ~ data[,35+j]
)
}

但是,这将为我的所有 data[,46] 值返回 NA。对可能出了什么问题有任何想法吗?如有必要,我很乐意提供示例数据,但我认为这与我犯了一个简单的编程错误更相关。提前致谢!

【问题讨论】:

  • 这似乎是一个更好的问题,因此可以通过使用tidyr 塑造您的数据来解决。如果您提供一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,那么提供帮助会更容易。展示您的真正目标,而不仅仅是您尝试编写的解决问题的代码。
  • 随便data[, 35] &lt;- data[, 35 + data[, 35]]?
  • @RuiBarradas,发表您的评论作为答案...??
  • @BenBolker 会的。

标签: r for-loop dplyr


【解决方案1】:

您所要做的就是记住 R 是矢量化的。
您将data[, 35] 与整数1 到10 进行比较,并将data[, 35 + &lt;1 to 10&gt;] 分配回data[, 35]。所以你要做的就是

data[, 35] <- data[, 35 + data[, 35]]

如果data[, 35] 中的值不在1:10 中,那么ifelse 将更合适。

data[, 35] <- ifelse(data[, 35] %in% 1:10, data[, 35 + data[, 35]], data[, 35])

【讨论】:

  • 不完全是。我正在检查 data[,35] 是否等于 1-10 的值,并根据这一点,将 data[,36] 输入 data[,46] 到 data[,35] == 1 的值中, data[,37] 变成 data[,46] 当 data[,35]==2 等等。做data[, 35] &lt;- data[, 35 + data[, 35]] 给我以下错误:Error in [.data.frame(data, , 35 + data[, 35]) : undefined columns selected
  • @Zereg 那么你的值必须不在 1-10 中。查看编辑。
【解决方案2】:

您可能需要[j] 如下所示将其迭代存储在data[,46]

for (j in 1:10) {
data[,46][j]<- case_when(
   data[,35] ==  j ~ data[,35+j]
)}

【讨论】:

  • 谢谢!大约一个小时前,您的解决方案对我有用......但现在我觉得我快疯了,因为它没有复制。我现在收到此错误:for (j in 2:10) { data[,46][j] &lt;- case_when( data$since == 1 ~ lag(data[,31], 1), data$since == j ~ data[,36+j] ) }(我知道代码有点不同,我将原始帖子中的示例保持简单,以使问题尽可能容易回答)。有什么想法吗?
  • 如果不完全了解您的数据,就很难理解。 lag 函数可能导致存储在 data[,46] 中的结果小于数据框的尺寸,即您的数据框的行数不足 1 个结果..
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 2022-01-12
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2018-11-08
相关资源
最近更新 更多