-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 回答