當左邊的值大於右邊的值時,我想交換每行中的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
當左邊的值大於右邊的值時,我想交換每行中的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
我們可以用pmin
和pmax
該任務。它們將返回行數長度的向量,其中一個具有第二列和第三列之間的最小值,一個具有最大值。然後,我們用新的值取代原來的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))
的另一種選擇是使用apply
和sort
:
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
版本出現比pmin
和pmax
慢:
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
使用transform
與pmin
和pmax
沿:
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)
這裏有一個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))]
啊,我剛剛切換了不平等 – Shape
你只需要更換順序錯誤行,用相同的重排排:
df[df$V2>df$V3,2:3] = df[df$V2>df$V3,3:2]
THX快速幫助 – ingo