0

データフレーム内の2つの列をチェックし、それらを比較するコードを記述したいと思います。1つには下限があり、もう1つには上限があるはずです。上限列の値が下限列の値よりも小さい場合は、値を交換する必要があります。下限と上限の両方がゼロの場合、上限列を2などの値に置き換える必要があります。サンプルデータは次のとおりです。

lower_limit upper_limit
0   3
0   4
5   2
0   15
0   0
0   0
7   4
8   2

コードを実行すると、次のようなものが生成されます。

lower_limit upper_limit
0   3
0   4
2   5
0   15
0   2
0   2
4   7
2   8
4

2 に答える 2

4
dfrm <- read.table(text="lower_limit upper_limit
 0   3
 0   4
 5   2
 0   15
 0   0
 0   0
 7   4
 8   2", header=TRUE)

dfrm2 <- dfrm
 dfrm2[,2] <- pmax(dfrm[,1], dfrm[,2] )
 dfrm2[,1] <- pmin(dfrm[,1], dfrm[,2] );
dfrm2[abs(pmax(dfrm[,1],dfrm[,2]))==0 , 2] <- 2

> dfrm2
  lower_limit upper_limit
1           0           3
2           0           4
3           2           5
4           0          15
5           0           2
6           0           2
7           4           7
8           2           8
于 2013-02-18T18:24:16.447 に答える
2

datあなたのデータフレーム/マトリックスの名前であると仮定します:

setNames(as.data.frame(t(apply(dat, 1, function(x) { 
                                         tmp <- sort(x);
                                         tmp[2] <- tmp[2] + (!any(x)) * 2; 
                                         return(tmp) }))), colnames(dat))
  lower_limit upper_limit
1           0           3
2           0           4
3           2           5
4           0          15
5           0           2
6           0           2
7           4           7
8           2           8

使い方?

関数applyは、各行に関数を適用するために使用されます (引数1)。この関数でxは、 は の行を表しdatます。まず、値が ( でsort) 順序付けられ、 object に格納されますtmp。次に、両方の値が である場合、 の 2 番目の値tmpは に置き換えられます。最後に、返されます。この関数は結果を行列として返しますが、これは ( で) 転置する必要があります。この行列は、元のオブジェクト( ) と同じ列名を持つデータ フレーム ( ) に変換されます。20tmpapplytas.data.framedatsetNames

于 2013-02-18T18:25:41.717 に答える