【问题标题】:Using apply to get a numeric value使用 apply 获取数值
【发布时间】:2013-06-17 13:46:41
【问题描述】:

我有两列数据,例如:

col1: c(1,2,3,0,7)
col2: c(4,5,6,7,3)

对于每一列,我想计算这个比率并将其作为列的最后一个值:

 No. of values less than 5/(No. of values greater than 5 + No. of values lesser than 5)

因此第一列的结果应该是 4/4+1 = 0.2

我是 R 新手,我能想到的唯一方法是遍历整个列并使用 if-else 结构。有没有更好的办法?

这是我不想使用的,因为它太笨重了:

for (a in 1:5)
{
if(col1<5){v1++;}
if(col1>5){v2++;}
}
v3<-v1/(v1+v2);
col1[6]<-v3;

当我执行上述操作时,我得到了错误:

Error in if (col1[a] < 5) { : missing value where TRUE/FALSE needed

我已经确保列中的所有数字都是数字,为什么会出现这个错误?

【问题讨论】:

  • 值 = 5 怎么样?也就是说,对于 col2,那么它是 2/(2+2) = 0.5(在这两种情况下都不计算 5)?
  • Values=5 将被忽略。应该提到这一点,我的错。

标签: r math loops error-handling apply


【解决方案1】:

你的数学没了。

DF <- data.frame(col1=c(1,2,3,0,7), col2=c(4,5,6,7,3))

result <- apply(DF,2,function(x) sum(x<5)/(sum(x!=5)))
result
#col1 col2 
# 0.8  0.5 

【讨论】:

  • 对不起数学!我了解此处的应用功能,但我想将答案存储在数据框元素或变量中。当我使用 apply 语句并将结果存储在变量“temp”中时,我收到一条错误消息,指出“dim(X) 必须为正长度”
  • @agstudy 已经展示了如何将结果作为一行添加到 data.frame,但在我看来这没有多大意义。我在答案中添加了如何将其存储在向量中。
【解决方案2】:

矩阵方法:

> m <- cbind(c(1,2,3,0,7), c(4,5,6,7,3))
> m
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
[4,]    0    7
[5,]    7    3

> colSums(m<5)/colSums(m!=5)
[1] 0.8 0.5

【讨论】:

    【解决方案3】:

    这将计算每列的比率并将其添加到最后一列:

      rbind(dat,apply(dat,2,
             function(x) c(sum(x<5)/(sum(x<5)+sum(x>5)))))
      col1 col2
    1  1.0  4.0
    2  2.0  5.0
    3  3.0  6.0
    4  0.0  7.0
    5  7.0  3.0
    6  0.8  0.5
    

    【讨论】:

      猜你喜欢
      • 2015-11-25
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 2017-04-12
      • 2020-10-31
      • 2019-03-11
      相关资源
      最近更新 更多