2

我是 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),优先级值来自 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
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 回答