使用R中的函数自动化

ivqmmu1c  于 2022-12-25  发布在  其他
关注(0)|答案(2)|浏览(121)

我有一个数据集,需要在其中执行以下步骤进行分析。

a <- with(iris, sum(Petal.Length[Petal.Width<0.2]))
b <- with(iris, sum(Petal.Length[Petal.Width<0.7]))
cc <- with(iris, sum(Petal.Length[Petal.Width<1]))
d <- with(iris, sum(Petal.Length[Petal.Width<3]))

e<-(b-a)
f<-(cc-b)
g<-(d-cc)

newdata <- data.frame(x=c(1,2,3),y=c(e,f,g))

我现在需要通过将Petal.Length替换为Sepal.Length等等来计算相同的值。因此,我为此编写了一个函数,但在使用h<- myfun(iris,Sepal.Length)时,我得到了错误'Sepal.Length' not found。感谢任何帮助。

myfun <- function(mydata,myvar){
  res <- NULL
  a <- with(mydata, sum(myvar[Petal.Width<0.2]))
  b <- with(mydata, sum(myvar[Petal.Width<0.7]))
  cc <- with(mydata, sum(myvar[Petal.Width<1]))
  d <- with(mydata, sum(myvar[Petal.Width<3]))
  
  e<-(b-a)
  f<-(cc-b)
  g<-(d-cc)
  
  res <- c(e,f,g)
  
}
w8biq8rn

w8biq8rn1#

这是一个简单的修复。记住把返回放在函数中。当你传递输入参数时,myvar应该是字符的形式

myfun <- function(mydata,myvar){
  a = sum(mydata[mydata[,"Petal.Width"] < 0.2 ,myvar])
  b = sum(mydata[mydata[,"Petal.Width"] < 0.7 ,myvar])
  c = sum(mydata[mydata[,"Petal.Width"] < 1 ,myvar])
  d = sum(mydata[mydata[,"Petal.Width"] < 3 ,myvar])
  
  e<-(b-a)
  f<-(c-b)
  g<-(d-c)
  
  return(c(e,f,g))
  
}

myfun(iris,"Petal.Length")

如果你想用R中已有的函数来写它,你可以使用cut,它把一个数值变量分成若干个区间,然后通过sapply为每个区间加上Petal.Length。

lev = c(0.2,0.7,1,3)
cutPoint = cut(iris$Petal.Width,
               breaks = c(min(iris$Petal.Width),0.2,0.7,1,3),
               labels = lev,
               right = F)
sapply(1:4, function(i) sum(iris$Petal.Length[cutPoint == lev[i]]))
9w11ddsr

9w11ddsr2#

试试看

myfun <- function(mydata,myvar){
  a <- sum(mydata[myvar]<0.2)
  b <- sum(mydata[myvar]<0.7)
  cc <- sum(mydata[myvar]<1)
  d <- sum(mydata[myvar]<3)
  
  e<-(b-a)
  f<-(cc-b)
  g<-(d-cc)
  
  c(e,f,g)
}

myfun(iris,"Petal.Length")

导致

[1]  0  0 50

相关问题