我正在尝试使用此代码的矢量化替代方法:
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
请帮忙。谢谢!
答案 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