我正在尝试清理调查数据,其中有时会在小时字段中输入分钟信息。如果缺少分钟或0和小时为15或30或45或60,则清洁规则会将小时值移至分钟字段。
这是我写的函数:
cleanHrMin <- function(x){
h = x[1]
m = x[2]
if ( !is.na(h) && (h==15 || h==30 || h==45 || h==60) && (m==0 || is.na(m)) )
{ return(c(0,h)) }
else
{ return(x) }
}
使用测试数据:
df <- as.data.frame(cbind(hrs = c(1,15,0), mins = c(10,NA,15)))
我按如下方式运行该功能:
as.data.frame(apply(df,1,cleanHrMin))
并获得输出:
V1 V2 V3
1 1 0 0
2 10 15 15
但我想要的是:
V1 V2
1 1 10
2 0 15
3 0 15
我做错了什么?
答案 0 :(得分:3)
您正在跨行执行正确的应用。您只需转置输出。
> as.data.frame(t(apply(df,1,cleanHrMin)))
V1 V2
1 1 10
2 0 15
3 0 15
这是因为apply
返回函数产生的列,无论您的边距是行还是列。因此,要从行到行,必须进行转置。