Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:在多个列中循环并在一个函数中使用所有列?_R - Fatal编程技术网

R:在多个列中循环并在一个函数中使用所有列?

R:在多个列中循环并在一个函数中使用所有列?,r,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

在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
# 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)
  }
}
如何在数据框中的所有列上应用此函数?例如用lappy、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的回答: 如何使用哪一个来区分min列是“min”还是NA?
我试过:


索引您想要这样的东西:

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

索引您想要这样的东西:

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

索引这将为您提供一个按行计算的分钟向量,如果您想要它的总数,那么只需将
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) )

dat$newmins这将为您提供一个按行计算的分钟向量,如果您想要它的总数,那么只需将它括起来:

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) )

dat$newmins@ZheyuanLi,为了更容易阅读,我在上面的编辑中发布了我的回复。@ZheyuanLi,为了更容易阅读,我在上面的编辑中发布了我的回复。谢谢,它似乎有效,但似乎缺少条目。与数据帧中的索引95相对应的实际上是向量中的索引92。有没有办法解决这个问题?我意识到这是因为在应用这个函数之前必须从数据框中删除某些行。那么我们如何让向量与数据帧的索引匹配呢?我很难理解到底做了什么。这本可以用作
dat$newmins,非常感谢。它似乎工作得很好!谢谢,它似乎工作,但它似乎有丢失的条目。与数据帧中的索引95相对应的实际上是向量中的索引92。有没有办法解决这个问题?我意识到这是因为在应用这个函数之前必须从数据框中删除某些行。那么我们如何让向量与数据帧的索引匹配呢?我很难理解到底做了什么。这本可以用作
dat$newmins,非常感谢。它似乎工作得很好!