Rにはまだまだ堪能ではありませんが、ここには方法があります。
# Sample data
df = data.frame(col1=c(1,0,3,4,5,6,107,8,9), col2=c(9,8,7,6,5,4,3,2,1))
# col1 col2
# 1 1 9
# 2 0 8
# 3 3 7
# 4 4 6
# 5 5 5
# 6 6 4
# 7 107 3
# 8 8 2
# 9 9 1
# Function to evaluate condition ==0 or 3 digits
cond <- function(x) { any(x==0 | x>=100 & x<=999); }
# Add column telling whether to swap by running the cond function over groups
# of three. Expand the groups again by repeating each value 3 times to match
# the rows.
df$swap = rep(lapply(split(df$col1, ceiling(seq_along(df$col1)/3)), FUN=cond), each=3)
# Swap the indicated rows
df[df$swap==TRUE,][c('col1', 'col2')] = df[df$swap==TRUE,][c('col2', 'col1')]
# Remove the swap column
df <- within(df, rm(swap))
# col1 col2
# 1 9 1
# 2 8 0
# 3 7 3
# 4 4 6
# 5 5 5
# 6 6 4
# 7 3 107
# 8 2 8
# 9 1 9
スワップ列をフレームに追加するのはあまり好きではありませんが、回避方法はあまりよく分かりません。
これをデータセットでテストしたところ、うまくいきました。 – AgentSmith