【问题标题】:Custom function returning incorrect value - example (conflicting vector names)自定义函数返回不正确的值 - 示例(冲突的向量名称)
【发布时间】:2021-11-18 02:10:26
【问题描述】:

由于某种原因,通过以下方式应用自定义函数时我无法获得相同的值:

MSD_p<-function(values,letters){
                  a<-abs(apply(combn(values,2), 2, diff))
                  b<-combn(letters,2)
                  c<-data.frame(t(rbind(a,b)))
                  c$a<-as.numeric(c$a)
                  c<-c[order(c$a),]
                  c$unique <- !sapply(gsub(" ", "", paste(c$V2, c$V3)), function(x) any(str_count(x, letters)>1))
                  m_1<-mean(c(min(c[c$unique==TRUE,]$a),max(c[c$unique==FALSE,]$a)))
                  c$unique_lag_3 <- ifelse(lag(c$unique) != c$unique & 
                                           lag(lag(c$unique)) != c$unique &
                                           lead(c$unique) == c$unique , "New", "Same")
                  rows <- lapply(which(c$unique_lag_3=="New"), function(x) (x-1):(x))
                  m_2<-mean(c[unlist(rows),]$a)
                  m_2<-as.numeric(m_2)
                  return(m_2)
}

MSD_p(dt3$values,dt3$letters)

结果为 8.5。

                  a<-abs(apply(combn(dt3$values,2), 2, diff))
                  b<-combn(dt3$letters,2)
                  c<-data.frame(t(rbind(a,b)))
                  c$a<-as.numeric(c$a)
                  c<-c[order(c$a),]
                  c$unique <- !sapply(gsub(" ", "", paste(c$V2, c$V3)), function(x) any(str_count(x, letters)>1))
                  m_1<-mean(c(min(c[c$unique==TRUE,]$a),max(c[c$unique==FALSE,]$a)))
                  c$unique_lag_3 <- ifelse(lag(c$unique) != c$unique & 
                                           lag(lag(c$unique)) != c$unique &
                                           lead(c$unique) == c$unique , "New", "Same")
                  rows <- lapply(which(c$unique_lag_3=="New"), function(x) (x-1):(x))
                  m_2<-mean(c[unlist(rows),]$a)
                  m_2<-as.numeric(m_2);m_2

结果为 9.75。

这怎么可能? 数据:

dt3<-data.frame(structure(list(trial_number = c(20L, 20L, 20L, 20L, 20L, 20L, 
20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 
20L), values = c(74.7, 81.1, 80.1, 90.1, 98.9, 96.1, 93.5, 95, 
99.6, 93.3, 96.7, 92.7, 94.7, 92.1, 100.3, 97.4, 94.1, 97.3, 
97.1, 93.1), letters = c("g", "cd", "d", "bc", "ab", "ab", "ab", 
"ab", "ab", "ab", "ab", "ab", "ab", "ab", "a", "ab", "ab", "ab", 
"ab", "ab")), row.names = c(NA, -20L), class = c("tbl_df", "tbl", 
"data.frame")))

感谢您的帮助。

【问题讨论】:

  • 有些名称是默认函数,即cletters(内置向量)。避免用已有的命名

标签: r dataframe lapply sapply


【解决方案1】:

感谢会员的建议,我能够通过以下方式正确解决这个问题:

MSD_p<-function(value,letter){
                  n<-abs(apply(combn(value,2), 2, diff))
                  l<-combn(letter,2)
                  dt<-as.data.frame(t(rbind(n,l)))
                  dt$n<-as.numeric(dt$n)
                  dt<-dt[order(dt$n),]
                  dt$inter <- !sapply(gsub(" ", "", paste(dt$V2, dt$V3)), function(x) any(str_count(x, letters)>1))
                  dt$inter_lag <- ifelse(lag(dt$inter) != dt$inter & 
                                           lag(lag(dt$inter)) != dt$inter &
                                           lead(dt$inter) == dt$inter , "New", "Same")
                  rows <- lapply(which(dt$inter_lag=="New"), function(x) (x-1):(x))
                  msd<-mean(dt[unlist(rows),]$n)
                  return(msd)
}



dt3 <- dt3 %>% group_by(trial_number) %>%
                  mutate(bb=MSD_p(value,letter))

【讨论】:

  • 在函数之外,你正在使用 group by
【解决方案2】:

在外部函数代码中,OP 使用letters,这是R 中的内置向量,它不是来自'dt3' 列'letters'

c$unique <- !sapply(gsub(" ", "", paste(c$V2, c$V3)), 
       function(x) any(str_count(x, letters)>1))

应该是dt3$letters

此外,使用函数名称 (c) 或 letters(内置向量)创建对象名称可能会导致错误情况


由于 OP 在代码中命名了内置结构,因此可以选择使用 dt3$letters 代替 letters 或仅用于重现输出,将上面的行更改为

c$unique <- !sapply(gsub(" ", "", paste(c$V2, c$V3)), 
       function(x) any(str_count(x, dt3$letters)>1))

运行代码给出

m_2
[1] 8.5

【讨论】:

  • @akrun,感谢您的帮助。你现在第二次帮助我了......我实际上去了那里并修改了所有可能导致错误的向量名称。但是,它应该是 c$unique 1),因为它正在计算字符串中唯一字母的数量。我现在用上面的代码解决了它。最终值应该是 9.75
  • @Garn_R 是的,无论如何。 letters 是默认向量。在函数中,它是从dt3$letters调用的,外面是默认向量
  • 我应该删除这篇文章还是保留它?
猜你喜欢
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多