2015-12-04 76 views
2

當左邊的值大於右邊的值時,我想交換每行中的V2和V3值?所以V3的值越大,V2的越小。交換R中行的值

V1 V2   V3 
3  113634042 112634042  
15 42130650 43130646  
5  59947488 60947483  
47 65968160 66968149  
16 30674811 29674823  
5  10441822 9441835 

回答

5

我們可以用pminpmax該任務。它們將返回行數長度的向量,其中一個具有第二列和第三列之間的最小值,一個具有最大值。然後,我們用新的值取代原來的2列:

df[,2:3]<-cbind(pmin(df[,2],df[,3]),pmax(df[,2],df[,3])) 

df 
# V1  V2  V3 
# 1 3 112634042 113634042 
# 2 15 42130650 43130646 
# 3 5 59947488 60947483 
# 4 47 65968160 66968149 
# 5 16 29674823 30674811 
# 6 5 9441835 10441822 

DATA:

df <- structure(list(V1 = c(3L, 15L, 5L, 47L, 16L, 5L), V2 = c(113634042L, 
42130650L, 59947488L, 65968160L, 30674811L, 10441822L), V3 = c(112634042L, 
43130646L, 60947483L, 66968149L, 29674823L, 9441835L)), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -6L)) 

的另一種選擇是使用applysort

t(apply(df[,2:3],1,sort)) 
#   [,1]  [,2] 
# [1,] 112634042 113634042 
# [2,] 42130650 43130646 
# [3,] 59947488 60947483 
# [4,] 65968160 66968149 
# [5,] 29674823 30674811 
# [6,] 9441835 10441822 

apply版本出現比pminpmax慢:

Unit: microseconds 
    expr  min  lq  mean median  uq  max neval cld 
    pmax 54.202 57.089 68.17331 68.4750 72.0025 167.738 100 a 
apply 561.263 581.950 624.66715 598.4675 630.5395 1179.936 100 b 
+0

THX快速幫助 – ingo

4

使用transformpminpmax沿:

transform(DF, V2 = pmin(V2, V3), V3 = pmax(V2, V3)) 

,並提供:

V1  V2  V3 
1 3 112634042 113634042 
2 15 42130650 43130646 
3 5 59947488 60947483 
4 47 65968160 66968149 
5 16 29674823 30674811 
6 5 9441835 10441822 

注:這裏是可重複的表單中的數據:

Lines <- "3  113634042 112634042  
15 42130650 43130646  
5  59947488 60947483  
47 65968160 66968149  
16 30674811 29674823  
5  10441822 9441835" 


DF <- read.table(text = Lines) 
0

這裏有一個data.t能夠解決方案,通過引用編輯列(複製艾蒂安的數據集):

library(data.table) 


df <- structure(list(V1 = c(3L, 15L, 5L, 47L, 16L, 5L), V2 = c(113634042L, 
42130650L, 59947488L, 65968160L, 30674811L, 10441822L), V3 = c(112634042L, 
43130646L, 60947483L, 66968149L, 29674823L, 9441835L)), .Names = c("V1", 
"V2", "V3"), class = "data.frame", row.names = c(NA, -6L)) 

dtable <- data.table(df) 

dtable[,c('V2','V3') := .(ifelse(V2 > V3, V3, V2), ifelse(V2 > V3, V2, V3))] 
+0

啊,我剛剛切換了不平等 – Shape

0

你只需要更換順序錯誤行,用相同的重排排:

df[df$V2>df$V3,2:3] = df[df$V2>df$V3,3:2]