将函数应用于行返回向量而不是列表

时间:2017-05-07 03:50:52

标签: r apply

我有一个数据框(下面是简化版)

b<-data.frame('v1'=1:2,'v2'=3:4,'v3'=5:6)

如果我在行上使用apply:

test<-apply(b,1,function(x) {if (x[length(x)]>0) return (x/x[length(x)]) else return (0)})

我得到了:

[,1]      [,2]
v1  0.2 0.3333333
v2  0.6 0.6666667
v3  1.0 1.0000000

到目前为止,我确实需要列名v1,v2,v3,因此在测试中成为行名。 但如果数据帧全为零,

b1<-data.frame('v1'=c(0,0),'v2'=c(0,0),'v3'=c(0,0))
test<-apply(b1,1,function(x) {if (x[length(x)]>0) return (x/x[length(x)]) else return (0)})

test将向量返回0 0 我的问题是如何让测试返回类似

的内容
[,1]      [,2]
v1  0      0
v2  0      0
v3  0      0

基本上如果连续的最后一个为零我想让行中的所有内容都为0,更重要的是我希望return是一个列表,这样我就得到了v1,v2,v3的行名(我可以改为数据帧如果返回是列表),现在返回是向量0,0我丢失了v1,v2,v3的所有信息。为什么所有零都会产生这样的差异?

1 个答案:

答案 0 :(得分:1)

为什么不创建一个将数据帧除以最后一列然后用零替换NAs的函数?

prop_last_col <- function(df) {
        prop <- df / df[, ncol(df)]
        prop[is.na(prop)] <- 0
        return(prop)
    }

prop_last(b)
         v1        v2 v3
1 0.2000000 0.6000000  1
2 0.3333333 0.6666667  1


 prop_last(b1)
  v1 v2 v3
1  0  0  0
2  0  0  0

如果您希望它与您的示例格式相同,则只需转置结果。