簡體   English   中英

使用傳遞給ggplot aes,data.frame和nls中函數的列名

[英]Using column name passed to function in ggplot aes, data.frame, and nls

好的,假設我在CSV文件(“ example_data.csv”)中包含以下數據:

Likelihood,Weight,Par1,Par2,Par3
0.186844384,0.036923697,2,2,58
0.533218654,0.501397958,0,0,65
0.242303977,0.003077206,1,1,46
0.345092541,0.444826685,2,2,23
0.293672855,0.108440953,2,3,29
0.287151901,0.788640671,2,2,45
0.662063373,0.995332406,-1,-2,71
0.515526137,0.089007922,-1,-1,110
0.330131798,0.419704507,1,1,43
0.340537446,0.384904805,-1,-1,78
0.42350387,0.817862511,0,0,94
0.278387583,0.912293985,1,2,53
0.413520775,0.465414836,1,1,56
0.111797213,0.276860883,3,3,26
0.420515164,0.642712917,1,1,68
0.30835086,0.882109026,1,1,24
0.576850063,0.518219853,0,-2,81
0.355660735,0.790567044,0,0,29
0.979357518,0.039895315,-4,-4,177
0.656909082,0.404682824,-2,-4,101
0.48684488,0.488388762,-2,-3,144
0.806577308,0.530345186,-2,-3,143
0.658578518,0.970476957,-2,-5,160
0.521646556,0.723287454,2,3,83
0.60702761,0.727149894,-2,-4,155
0.694971183,0.071413935,3,4,22
0.351835995,0.98549942,-1,-1,81
0.916744944,0.867929188,-1,-2,91
0.646122983,0.395781956,-1,-2,95
0.292583756,0.907615016,-1,-1,89
0.500997719,0.7635543,-2,-4,142
0.827681213,0.094512069,-2,-5,149
0.904759491,0.374158994,-3,-4,97
0.783803411,0.962195178,-3,-4,102
0.382691023,0.41835611,0,0,21
0.290186245,0.842489929,2,2,10
0.417623103,0.413883742,-3,-4,145
0.813249374,0.265328688,-2,-3,102
0.882071817,0.817630957,-2,-4,99
0.849050068,0.101411688,-2,-2,61
0.390254013,0.637964495,1,1,22
0.243507734,0.070444932,2,3,15
0.259785717,0.501507883,2,2,5
0.685399514,0.347204068,-3,-5,152
0.483162564,0.724026851,-3,-4,121
0.828930794,0.71894471,0,-1,50
0.282705441,0.551101402,1,1,21
0.09732417,0.113851154,3,4,29
0.22818404,0.000950461,1,1,32
0.132510088,0.654162829,0,0,58
0.229581317,0.099388171,1,2,99
0.768479467,0.014822263,-2,-3,126
0.572649738,0.465394695,-1,-1,107
0.195123412,0.677059169,0,0,64
0.602264748,0.128128995,-1,-1,112
0.566370697,0.454819417,-3,-5,180
0.962733978,0.909347539,-5,-3,215
0.762192377,0.840566094,-3,-4,194
0.909048091,0.146816754,-2,-4,205
0.411053888,0.199181775,-1,-2,38
0.262232454,0.144137241,-1,-1,74
0.437649773,0.583755593,-1,-2,76
0.71896061,0.147700762,-2,-3,103
0.697941592,0.080480032,-2,-3,77
0.500277498,0.649807717,-3,-4,98
0.437533815,0.006917082,-1,-1,27
0.276252625,0.776412941,0,0,56
0.660321112,0.516544613,-1,-2,94
0.396011967,0.1709671,-2,-3,98
0.539238702,0.703846181,-2,-3,125
0.998578074,0.106352132,-2,-4,184
0.552325405,0.970471559,-3,-5,109
0.380106473,0.948651389,0,0,60
0.887789916,0.328624317,-3,-4,159

我通過標准方式將其加載到數據幀中:

dat <- read.csv("example_data.csv")

我正在嘗試編寫一個函數,該函數對於給定的列名稱,計算nls擬合,並使用給定的列值作為x值繪制擬合和數據(帶有一些抖動“ + runif(10,-0.1,0.1) “,以減輕重疊)

plotfun <- function (data, parameter) {
  start <- getInitial(Likelihood~SSlogis(substitute(parameter),alpha,xmid,scale),data)
  m <- nls(Likelihood~1/(1+exp((xmid-substitute(parameter))/scale)), start=start[c(2,3)], data=data, weight=Weight)

  pred <- data.frame(substitute(parameter)=seq(min(data$parameter),max(data$parameter),length.out=100))
  pred$y <- predict(m, newdata=pred)

  p <- ggplot (data, aes_q (y=~Likelihood, x=substitute(parameter+runif(10,-0.1,0.1))))
  p + geom_point(size = 1) + geom_line(data=pred, aes_q(x=substitute(parameter),y=~y))
}

plotfun(dat, Par1)

但這失敗了……基本上,我不知道何時應該使用裸變量名稱以及何時應該使用substitute或我不知道的其他功能。

有人可以解釋如何正確編寫此功能嗎?

R不會像SAS或C編譯器那樣執行基於文本的替換宏。 當您需要構建表達式時,需要確保它們的類型正確,以便R知道要評估的值,而不要評估的值。 如果你有一堆要替換另一個符號某個符號的地方,那么你可以使用substitute 這是您的函數的重寫。

plotfun <- function (data, parameter) {
  p <- substitute(parameter)
  expr <- substitute({
    start <- getInitial(Likelihood~SSlogis(parameter,alpha,xmid,scale),data)
    m <- nls(Likelihood~1/(1+exp((xmid-parameter)/scale)), start=start[c(2,3)], data=data, weight=Weight)

    pred <- setNames(data.frame(seq(min(data$parameter),max(data$parameter),length.out=100)), as.character(expression(parameter)))
    pred$y <- predict(m, newdata=pred)

    p <- ggplot (data, aes(y=Likelihood, x=parameter+runif(74,-0.1,0.1)))
    p + geom_line(data=pred, aes(x=parameter,y=y))
  }, list(parameter=p))
  eval(expr)
}

由於您想通過向函數傳遞未評估的符號來執行非標准評估,因此您需要做一些額外的工作。 在這里,我們在參數parameter上使用substitute()來捕獲該參數的promise中的符號。 然后,我們使用replace substitute()用您傳入的任何內容替換parameter代碼塊中的所有匹配項。然后我們eval()該新代碼塊。

奇怪的是,您為函數的參數命名(例如data.frame(a=1)a data.frame(a=1) substitute()看到它們的方式的正確符號。它們被稱為參數。)本質上是按下我們傳入的符號,並使用帶有該字符值的setNames()使其起作用。

因此,基本上我只使用了兩次替換,一次捕獲傳遞給函數的未評估符號,然后將代碼重新編寫在一個塊中。 然后我也只使用了aes()而不是aes_q()

一種更簡單的方法可能是將列名作為字符串傳遞。 動態生成具有字符值的代碼通常比使用符號更好。

這是另一個答案,您只需輸入一個字符串

plotfun <- function (data, parameter) {
  data$.var. <- data[,parameter]

  start <- getInitial(Likelihood~SSlogis(.var.,alpha,xmid,scale),data)
  m <- nls(Likelihood~1/(1+exp((xmid-.var.)/scale)), start=start[c(2,3)], data=data, weight=Weight)

  pred <- data.frame(.var. = seq(min(data[,parameter]),max(data[,parameter]),length.out=100))
  pred$y <- predict(m, newdata=pred)

  p <- ggplot (data, aes(y=Likelihood, x=.var.+runif(74,-0.1,0.1)))
  p + geom_point() + geom_line(data=pred, aes(x=.var., y=y)) + xlab(parameter)
}
library(ggplot2)
plotfun(dat, "Par1")

我們只創建一個名為.var.的列.var. 使大多數編碼更加容易,只需在末尾更改x標簽即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM