交换的矢量化替代方案

时间:2013-10-09 14:23:56

标签: r loops transform vectorization

我正在尝试使用此代码的矢量化替代方法:

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

请帮忙。谢谢!

2 个答案:

答案 0 :(得分:4)

我会使用[对相关行进行分组,并使用rev来交换列(现在cbind以包含您想要乘以{{1}的列} ...当然,现在这种操作变得比我想要的更复杂和难以理解,因为你没有在OP中完全陈述你的要求。请下次再这样做。

-1

@BenBolker 建议从子集化行创建一个对象,以使代码更具可读性和效率......

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

好多了。

答案 1 :(得分: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