2016-03-26 9 views
-2

Rが効率的に処理する方法を知りたいという状況があります。データセットにV1とV2の2つの列があるとします。 ここでは、次の2つの条件について、列V1を評価し、一度に3行(1〜3行、4〜6など)をチェックする方法を示します。 - a)3行V1の3つの行のいずれかに3桁の数字が含まれていますか?条件が満たされた場合はn行を選択し、条件を評価し、Rを使用して列を交換します。R

となり、V1の3つの値とV2の値が入れ替わります。

これをRで実行する方法を見つけるのには苦労しています。これは500,000行と5つの列で行われるため、効率が重要になります。

ありがとうございます!

答えて

0

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 

スワップ列をフレームに追加するのはあまり好きではありませんが、回避方法はあまりよく分かりません。

+0

これをデータセットでテストしたところ、うまくいきました。 – AgentSmith

関連する問題