【问题标题】:apply(ifelse(....mean, 0)) Error in rep(yes, length.out = len) : attempt to replicate an object of type 'closure' [closed]应用(ifelse(..mean,0))rep中的错误(是,length.out = len):尝试复制'closure'类型的对象[关闭]
【发布时间】:2021-06-29 08:33:48
【问题描述】:

我处理调查数据并通过组合来自不同问题的答案来构建索引。

当答案最少为 2 时,我想创建一个新变量,对 3 个问题(从 1 到 10 分)的平均答案进行评分。否则,我希望我的 newvar 得分为 0。所有这一切都在答案的条件下都与NA不同。

这是我尝试获得的示例

DF <-
  data.frame(matrix(
    c(1, 3, 4, 9, 4, 3, 10, 4, 6, 4, 7, NA),
    nrow = 4,
    ncol = 3
  ))

#    X1 X2 X3 
# 1  1  4  6 
# 2  3  3  4 
# 3  4 10  7  
# 4  9  4 NA  

我想创建 DF$new_var_ave 比如

#    X1 X2 X3 new_var_ave
# 1  1  4  6  0
# 2  3  3  4  3.3
# 3  4 10  7  7 
# 4  9  4 NA  NA

I have tried :
```R
DF$new_var_ave <-
      apply(DB_W[, c("X1", "X2", "X3")], 1, function(x) {
        ifelse(any(is.na(x)), NA, ifelse(all(x > 2), mean, 0))})`

但是它失败了,我收到了错误文本:

Error in rep(yes, length.out = len) : 
      attempt to replicate an object of type 'closure'

非常感谢您的帮助和建议。

【问题讨论】:

  • 欢迎来到 StackOverflow!你的意思是mean(x), 0 而不是mean, 0
  • 感谢 Aurèle!我想要三个变量的平均值。
  • 以后,请考虑在您的问题中包含minimal reproducible example
  • 你是对的。我会编辑我的问题
  • 为什么你的第二行的平均值等于0

标签: r apply mean


【解决方案1】:

这是根据您设置的标准计算平均值的另一种方法。我想你可能会感兴趣:

library(purrr)
library(dplyr)
library(tidyr)

df <- tribble(
  ~var1, ~var2, ~var3,  ~new_var_ave,
    1,    4,   6,     0,
    3,    3,   4,     0,
    4,   10,   7,     7,
    9,   4,    NA,    NA,
  
) %>%
  select(-new_var_ave)


df %>%
  mutate(avg = pmap(list(var1, var2, var3), ~ ifelse(any(is.na(c(...))), as.double(NA), 
                                                   ifelse(all(c(...) > 2), mean(c(...)), 0))
  )) %>%
  unnest(cols = c(avg))

# A tibble: 4 x 4
   var1  var2  var3   avg
  <dbl> <dbl> <dbl> <dbl>
1     1     4     6  0   
2     3     3     4  3.33
3     4    10     7  7   
4     9     4    NA NA 

【讨论】:

  • 太好了,谢谢@Anoushiravan R!我和我的同事正在为这个项目使用 Dataframe。如果我们不能用df解决我们的pb,我会接受你的提议!
  • 很高兴,但如果这里的任何答案解决了您的问题,请随时投票。我很乐意随时提供帮助。
  • 这是一个 tibble 也是一个数据框,你只需要安装我提到的所需的包就可以使用它。无论如何,这是您的选择,但如果能在这里从不同的贡献者那里学习替代解决方案,那就太好了。
  • 如果您想使用DT 示例,可以使用以下代码。唯一的区别是列名:names(DF) &lt;- c("var1", "var2", "var3")
【解决方案2】:

此解决方案使用rowSums 检查是否有值&lt; 2rowMeans 来计算ifelse 语句中的行均值:

DF$new_var_ave <- ifelse(rowSums(DF < 2) > 0, 0, round(rowMeans(DF),1))
DF
  X1 X2 X3 new_var_ave
1  1  4  6         0.0
2  3  3  4         3.3
3  4 10  7         7.0
4  9  4 NA          NA

【讨论】:

  • 这是您需要的吗?
  • @ChrisRuehlemann 如果所有三个变量中的一个值低于2,那么new_var_ave 应该等于0
猜你喜欢
  • 2013-07-17
  • 2019-12-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 2019-07-16
相关资源
最近更新 更多