r - 自定义函数返回不正确的值 - 示例(冲突的向量名称)
问题描述
出于某种原因,通过以下方式应用自定义函数时,我无法获得相同的值:
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")))
感谢帮助。
解决方案
在外部函数代码中,OP 使用letters
,这是一个内置向量,R
它不是来自“dt3”列“字母”
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
推荐阅读
- mapsui - MyLocation 符号可以用用户图形更改吗?
- r - 使用 igraph R 包与图进行比较时,如何比较两个图以识别图 2 中唯一边的数量
- r - 如何在 R 数据框中删除标题为 NA 的列/变量?
- docker - 无法访问同一 VM 上的第二个 docker 容器
- python - 我可以使用 OR 条件在 Pandas 中删除行吗?
- excel - 根据两列中的相同值使用 vba 删除 Excel 行
- python - 在python中编写表达式:将字符串乘以int
- postgresql - Gitlab CI/CD的review阶段访问postgresql
- php - PHP中pack('V')的反向操作是什么?
- amazon-web-services - 如何仅向应用版本 > 4.1.1 的用户发送推送通知