【发布时间】: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