根据优先级列表选择数据框中的值

时间:2013-02-14 03:30:04

标签: r

我是R的新手,所以我仍然围绕着它的工作方式。我的问题如下,我有一个数据框和一个列的优先列表(pl),我需要:

  1. 要查找每行pl中的列的最大值,并使用此值(df$max)创建新列
  2. 使用优先级列表,从优先级值中减去此最大值,忽略NAs并返回绝对差值
  3. 可能更好的例子: 我的优先事项清单是

    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),优先级值来自列D(9),因为E是NA。我想要的答案应该是这样的。

        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
    

3 个答案:

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

答案 1 :(得分: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的行,此代码都会中断。没有检查。

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