【问题标题】:R: Looping through multiple columns and using all columns in a function?R:循环遍历多个列并使用函数中的所有列?
【发布时间】:2017-02-05 09:43:05
【问题描述】:

在 R 中:如何循环遍历多个列并使用自定义函数,该函数从每个列中获取一个参数并相应地修改这些列?

例如我有以下数据框:

> head(runTimeSep)
  hours   h minutes  min
1    70 min      NA <NA>
2    21 min      NA <NA>
3   106 min      NA <NA>
4    75 min      NA <NA>
5    14 min      NA <NA>
6    82 min      NA <NA>
7     1 h        11 min

我的目标是在小时列中获取总分钟列表。如果“1h”列在小时和 h 列中,则将小时转换为分钟并添加分钟列中的分钟(或不添加任何内容,这是一个完美的小时,分​​钟列中包含 NA)。

因此,我创建了以下函数以应用于数据框:

# convert hours to minutes function
hoursToMins = function(hours, h, minutes, min) {
  if (h == 'h' && min == "min") {
    (hours = as.numeric(hours)*60+as.numeric(minutes))
  }
  if (h=="h" && min != "min") {
    (hours = as.numeric(hours)*60)
  }
}

如何将此函数应用于数据框中的所有列?例如。使用 lapply、ddpply 等。

编辑:我还尝试了以下操作:

finalRunTime = ifelse(runTimeSep$h == "h", runTimeSep$hours*60,               runTimeSep$hours)
head(finalRunTime)  
runTimeSep$hours = finalRunTime

效果很好。但是当我尝试应用第二轮 ifelse 时:

finalRunTime = ifelse(runTimeSep$min == "min", runTimeSep$hours +  runTimeSep$minutes, runTimeSep$hours)
head(finalRunTime)
runTimeSep$hours = finalRunTime

第二轮导致 else 情况(如果没有分钟列)变为 NA。请帮忙。谢谢。

回应@Sandipan 的回答: 如何使用 which 来区分 min 列是 'min' 还是 NA?
我试过了:

indices <- which(runTimeSep$h == 'h' && runTimeSep$min != 'min')
runTimeSep[indices,]$hours <- 60*runTimeSep[indices, ]$hours

indices <- which(runTimeSep$h == 'h' && runTimeSep$min == 'min')
runTimeSep[indices,]$hours <- 60*runTimeSep[indices, ]$hours + 
  runTimeSep[indices,]$minutes

但是,两组索引都返回空集。

【问题讨论】:

  • @ZheyuanLi,为了便于阅读,我在上面的编辑中发布了我的回复。

标签: r


【解决方案1】:

这将为您逐行提供分钟向量,如果您想要其总数,则只需将 sum() 包裹在其周围:

with( dat,   (h=="h")*60*hours + (h=="min")*hours + 
                                             ifelse( is.na(minutes), 0, minutes) )

[1]  70  21 106  75  14  82  71

当分钟为 NA 时,它用 0 代替 NA。当需要具有这些值的新列时,您可以这样做:

 dat$newmins <- with( dat, (h=="h")*60*hours + (h=="min")*hours + 
                                             ifelse( is.na(minutes), 0, minutes) )

【讨论】:

  • 谢谢,它似乎可以工作,但是它似乎缺少条目。例如。与数据帧中的索引 95 对应的实际上是向量中的索引 92。任何想法如何解决这个问题?
  • 我意识到这是因为在应用此函数之前必须从数据框中删除某些行。那么我们如何让向量与数据框的索引匹配呢?
  • 我很难理解做了什么。这可以用作dat$newmins &lt;- with( dat, (h=="h")*60*hours + (h=="min")*hours + ifelse( is.na(minutes), 0, minutes) ),并且表达式中所有术语的长度将保证与数据帧中的行数相匹配。
  • 非常感谢。看起来效果很好!
【解决方案2】:

你想要这样的东西:

indices <- which(runTimeSep$h == 'h')
runTimeSep[indices,]$hours <- 60*runTimeSep[indices, ]$hours + 
                              runTimeSep[indices,]$minutes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2010-12-09
    • 2018-12-02
    • 2017-03-09
    相关资源
    最近更新 更多