有条件地在一行上应用函数

时间:2013-11-14 23:28:58

标签: r posixct

我正在尝试执行以下操作:

评估数据框中的POSIXct类列,如果观察是偶数秒做什么,如果它是奇数秒,则添加1。

这是我到目前为止所做的:

df[,1] <- lapply(df[,1], function(x) ifelse(as.integer(x)%%2==0, yes = x, no = x+1))

此时我的电脑内存不足,可能是因为yes = x功能中的ifelse ......但我不确定。

有没有更好的方法来解决这个问题?

注意:大约有150,000个障碍物。

修改 以下是我的数据示例:

             Timestamp   PSTC01 PSTC02 PSTC03 PSTC04   PSTC05   PSTC06   PSTC07 PSTC08   PSTC09   PSTC10   PSTC11
1  2013-09-02 23:56:02 0.225339     NA     NA     NA       NA 0.222298 0.253884     NA 0.243435       NA       NA
2  2013-09-02 23:56:32 0.220459     NA     NA     NA       NA 0.220009 0.250797     NA 0.241659       NA       NA
3  2013-09-02 23:57:02 0.218379     NA     NA     NA       NA 0.216663 0.252008     NA 0.240208       NA       NA
4  2013-09-02 23:57:32 0.218264     NA     NA     NA       NA 0.215935 0.256784     NA 0.240165       NA       NA
5  2013-09-02 23:58:02 0.222438     NA     NA     NA       NA 0.220964 0.253382     NA 0.241622       NA       NA
6  2013-09-02 23:58:32 0.222154     NA     NA     NA       NA 0.222533 0.252455     NA 0.242187       NA       NA
7  2013-09-02 23:59:02 0.223612     NA     NA     NA       NA 0.226128 0.253611     NA 0.243376       NA       NA
8  2013-09-02 23:59:32 0.221370     NA     NA     NA       NA 0.225215 0.253617     NA 0.243793       NA       NA
9  2013-09-06 00:00:01 0.268708     NA     NA     NA 0.207481       NA 0.277915     NA       NA 0.241519 0.242069
10 2013-09-06 00:00:31 0.268708     NA     NA     NA 0.207481       NA 0.277915     NA       NA 0.241519 0.242069
11 2013-09-06 00:01:01 0.265310     NA     NA     NA 0.218782       NA 0.269295     NA       NA 0.236030 0.211069
12 2013-09-06 00:01:31 0.270377     NA     NA     NA 0.217813       NA 0.272507     NA       NA 0.236714 0.219648
13 2013-09-06 00:02:01 0.271845     NA     NA     NA 0.213403       NA 0.271097     NA       NA 0.236685 0.218460

2 个答案:

答案 0 :(得分:2)

df[1] <- df[1] + as.integer(df[[1]]) %% 2
由于矢量化操作,

会快得多。顺便说一句:yes中您不需要ifelse,但它不会影响速度。

上面的命令为所有奇数值增加了一秒。如果你想做相反的事情,即在偶数值上加一秒,你只需插入逻辑而不是运算符,!

df[1] <- df[1] + !as.integer(df[[1]]) %% 2

答案 1 :(得分:1)

尝试

df[df[,1] %% 2 == 0,1] <- df[df[,1] %% 2 == 0,1] + 1

编辑:

看完你的评论后,看起来Sven的想法最有效。试试这个(并采用Sven的方法):

df[,1] <- df[,1] + {as.integer(df[,1]) %% 2}