-2

このコードのベクトル化された代替手段を使用しようとしています:

x=read.table("1.txt")
for(i in 1:nrowx)
{
  if(x[i,1]>x[i,2])             
  {
    temp=x[i,1]
    x[i,1]=x[i,2]
    x[i,2]=temp
    x[i,3]=(x[i,3]*(-1))
  }
}   

変換関数を使用してみました:

x <- transform(x, 
               x[[1]] <- ifelse(x[[1]]>x[[2]], x[[2]], x[[1]]), 
               x[[2]] <- ifelse(x[[1]]>x[[2]], x[[1]], x[[2]]),
               x[[3]] <- ifelse(x[[1]]>x[[2]], -x[[3]], x[[3]]))

しかし、それでは成功しません。何も操作せずに元のファイルを返します。

x で読み込まれたファイルの数行:

"X1" "X2" "X3"
"1" 10 4 1440
"2" 10 4 3765
"3" 10 22 523
"4" 10 295 730
"5" 10 295 1599
"6" 10 584 1872
"7" 10 403 1872
"8" 10 403 1872
"9" 10 281 554
"10" 10 123 554

助けてください。ありがとう!

4

2 に答える 2

4

[関連する行をサブセット化しrev、列を交換するために使用します(そしてcbind、乗算したい列を含めるために-1)...もちろん、これは私が望むよりも複雑で判読できない操作になりつつあります。 OPであなたの要件を完全に述べていませんでした。次回も是非お願いします。

x[ x[,1] > x[,2] , 1:3 ] <- cbind( rev( x[ x[,1] > x[,2] , 1:2 ] ) , 
                                        x[ x[,1] > x[,2] , 3 ] * -1 )
#   X1  X2    X3
#1   4  10 -1440
#2   4  10 -3765
#3  10  22   523
#4  10 295   730
#5  10 295  1599
#6  10 584  1872
#7  10 403  1872
#8  10 403  1872
#9  10 281   554
#10 10 123   554

@BenBolkerは、サブセット化された行からオブジェクトを作成して、より読みやすく効率的なコードを作成することを提案しています...

swaprows <- x[,1] > x[,2]
x[swaprows,] <- cbind(rev(x[swaprows,1:2]),-x[swaprows,3])

ずっといい。

于 2013-10-09T14:46:41.517 に答える
1

引き続き使用できifelseますが、同じ変数に対して操作を行っているため、X1 と X2 を X4 と X5 として作成し、最後にこれらを削除することをお勧めします。

x$X4<-x$X1
 x$X5<-x$X2
 x$X1<-with(x,ifelse(X1>X2,X2,X1))
 x$X2<-with(x,ifelse(X4>X2,X4,X2))
 x$X3<-with(x,ifelse(X4>X5,-X3,X3))
 x$X4<-NULL
 x$X5<-NULL
> x
   X1  X2    X3
1   4  10 -1440
2   4  10 -3765
3  10  22   523
4  10 295   730
5  10 295  1599
6  10 584  1872
7  10 403  1872
8  10 403  1872
9  10 281   554
10 10 123   554
于 2013-10-09T14:48:52.843 に答える