R:循环遍历多个列并使用函数中的所有列?

时间:2016-09-27 16:40:55

标签: r

在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

我的目标是获取小时列中的总分钟列表。如果&#34; 1h&#34;列在小时和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

第二轮导致其他情况(如果没有分钟列)成为NA。请帮忙。感谢。

回应@ Sandipan的回答: 我如何使用哪个来区分最小列是否为“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

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

2 个答案:

答案 0 :(得分:2)

这会给你一个逐行的向量,如果你想要它的总数,那么只需在它周围包裹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) )

答案 1 :(得分:0)

你想要这样的东西:

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