【问题标题】:Loop through columns applying function between select columns循环通过在选择列之间应用函数的列
【发布时间】:2018-11-07 20:25:18
【问题描述】:

数据:

dat <- data.frame(id = "T2", Height = 1.2, 
              Number_2 = 1, node_age_2 = 0, 
              Number_3 = 1, node_age_3 = 1, 
              Number_4 = 1, node_age_4 = 2)

我需要循环使用一系列复杂的函数来遍历这个数据框。我不确定循环遍历每一列以及如何实现。我设想的步骤是:

  1. 从最低值列开始Number_2:node_age_2
  2. 应用函数Answer_2 = Number_2 + node_age_2
  3. 应用函数Answer_3 = Number_3 + node_age_3
  4. if (Answer_3 &lt; Answer_2){Answer_3} ELSE {Answer_2}
  5. 按顺序继续数据帧的末尾。

最终,最终产品将如下所示:

id Height Number_2 node_age_2 Answer_2 Number_3 node_age_3 Answer_3 Number_4 node_age_4 Answer_4
1 T2    1.2        1          0        1        1          1        1       1          2        1

我已经大大简化了这个功能。我的真实数据集比这大得多(115 组变量),实际上每个数字中有许多不同的列。我只需要理解这个简单的例子就可以开始了。所以想法是循环遍历而不调用每个名称。

【问题讨论】:

  • @RyanD 已相应编辑
  • @RyanD 是的,我总是与Answer_2 进行比较,并且只有在小于之前的Answer 时才采用新的Answer。所以在本例中,所有内容都与答案 2 进行比较,但实际上它只是与之前的值进行比较。

标签: r function for-loop


【解决方案1】:

如果您将数据重塑为“长”格式,则可以通过分组操作获得总和

library(tidyverse)

Answers <- 
  dat %>% 
    gather(key = 'NumNode', value = 'value', Number_2:node_age_4) %>% 
    group_by(grp = parse_number(NumNode)) %>% 
    do(Answer = with(.data, value[grep('Num', NumNode)] + value[grep('node', NumNode)]))

# # A tibble: 3 x 2
#     grp Answer
#   <dbl>  <dbl>
# 1  2.00   1.00
# 2  3.00   2.00
# 3  4.00   3.00

那么你的if 逻辑可以通过accumulateing min 来实现

answers <- accumulate(Answers$Answer, pmin)
# [1] 1 1 1

您可以将结果添加为dat 的列

dat[paste0('Answer_', Answers$grp)] <- ifelse(is.list(answers), answers, as.list(answers))

具有 > 1 行的示例数据

dat <- data.frame(id = "T2", Height = 1.2, 
              Number_2 = 1:2, node_age_2 = 0:1, 
              Number_3 = 1:2, node_age_3 = 1:2, 
              Number_4 = 1:2, node_age_4 = 2:3)

上述方法的输出

  id Height Number_2 node_age_2 Number_3 node_age_3 Number_4 node_age_4 Answer_2 Answer_3 Answer_4
1 T2    1.2        1          0        1          1        1          2        1        1        1
2 T2    1.2        2          1        2          2        2          3        3        3        3

【讨论】:

    猜你喜欢
    • 2018-08-13
    • 2022-01-08
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多