我有一个数据框(下面是简化版)
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的所有信息。为什么所有零都会产生这样的差异?
答案 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
如果您希望它与您的示例格式相同,则只需转置结果。