2

私はRを初めて使用するので、Rの仕組みについてまだ頭を悩ませています。私の問題は次のとおりです。データフレームと優先順位付けされた列のリスト ( pl) が必要です。

  1. 各行の列から最大値を見つけ、plこの値で新しい列を作成するには ( df$max)
  2. プライオリティ リストを使用して、この最大値をプライオリティ値から減算し、NA を無視して絶対差を返します。

おそらく例の方が良いでしょう:私の優先リストは

pl <- c("E","D","A","B")

データフレームは次のとおりです。

    A   B   C   D   E   F   G   
1   15  5   20  9   NA  6   1   
2   3   2   NA  5   1   3   2   
3   NA  NA  3   NA  NA  NA  NA  
4   0   1   0   7   8   NA  6
5   1   2   3   NA  NA  1   6

したがって、最初の行の最大値は列 A (15) からのものであり、E は NA であるため、優先度の値は列 D (9) からのものです。私が望む答えは次のようになります。

    A   B   C   D   E   F   G   MAX MAX-PR
1   15  5   20  9   NA  6   1   15  6
2   3   2   NA  5   1   3   2   5   4
3   NA  NA  3   NA  NA  NA  NA  NA  NA
4   0   1   0   7   8   NA  6   8   0
5   1   2   3   NA  NA  1   6   2   1
4

3 に答える 3

3

これはどう?

df$MAX <- apply(df[,pl], 1, max, na.rm = T)
df$MAX_PR <- df$MAX - apply(df[,pl], 1, function(x) x[!is.na(x)][1])
df$MAX[is.infinite(df$MAX)] <- NA
> df

#    A  B  C  D  E  F  G MAX MAX_PR
# 1 15  5 20  9 NA  6  1  15      6
# 2  3  2 NA  5  1  3  2   5      4
# 3 NA NA  3 NA NA NA NA  NA     NA
# 4  0  1  0  7  8 NA  6   8      0
# 5  1  2  3 NA NA  1  6   2      1
于 2013-02-14T03:47:57.500 に答える
2

例:

df <- data.frame(A=c(1,NA,2,5,3,1),B=c(3,5,NA,6,NA,10),C=c(NA,3,4,5,1,4))
pl <- c("B","A","C")
#now we find the maximum per row, ignoring NAs
max.per.row <- apply(df,1,max,na.rm=T)
#and the first element according to the priority list, ignoring NAs
#(there may be a more efficient way to do this)
first.per.row <- apply(df[,pl],1, function(x) as.vector(na.omit(x))[1])
#and finally compute the difference
max.less.first.per.row <- max.per.row - first.per.row

このコードは、すべて NA であるすべての行で壊れることに注意してください。それに対するチェックはありません。

于 2013-02-14T03:54:11.723 に答える
0

こちらはシンプルバージョン。まず、pl 列のみを取得し、各行について na を削除してから、最大値を計算します。

 df <- dat[,pl]
 cbind(dat, t(apply(df, 1, function(x) {
                      x <- na.omit(x)
                      c(max(x),max(x)-x[1])
                    }
                )
              )
       )


   A  B  C  D  E  F  G    1  2
1 15  5 20  9 NA  6  1   15  6
2  3  2 NA  5  1  3  2    5  4
3 NA NA  3 NA NA NA NA -Inf NA
4  0  1  0  7  8 NA  6    8  0
5  1  2  3 NA NA  1  6    2  1
于 2013-02-14T04:31:24.493 に答える