【问题标题】:Apply a function within another, using the same list in R在另一个函数中应用一个函数,在 R 中使用相同的列表
【发布时间】:2020-03-30 09:17:02
【问题描述】:

我需要帮助,我正在尝试在具有相同 df 的另一个函数中运行一个函数,但是当我运行代码时总是出现错误消息

下面是我的 df 示例

X <- c("Bloc", "Mp", "xcible",  "ycible", "xO", "yO", "xN", "yN", "xE", "yE", "xS", "yS", "ID_ligne")
C <- c("LE-01", 22, 2.404024, -39.5192, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-006-22")
D <- c("LE-01", 20, 1.362262, -40.59871, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-006-20")
E <-c("LE-01", 22, 2.404024, -39.5192, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-005-22")
G <- c("LE-01", 20, 1.362262, -40.59871, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-005-20")
H <- c("LE-01", 24, 1.710175, -33.79383, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-004-24") 
J <- c("LE-01", 22, 2.404024, -39.5192, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-003-22")

Ex <- rbind(C,D,E,G,H,J)
colnames(Ex) <- X
Ex <- as.data.frame(Ex)
Ex$xO <- as.numeric(as.character(Ex$xO))
Ex$xS <- as.numeric(as.character(Ex$xS))
Ex$xN <- as.numeric(as.character(Ex$xN))
Ex$xE <- as.numeric(as.character(Ex$xE))
Ex$yO <- as.numeric(as.character(Ex$yO))
Ex$yS <- as.numeric(as.character(Ex$yS))
Ex$yN <- as.numeric(as.character(Ex$yN))
Ex$yE <- as.numeric(as.character(Ex$yE))
Ex.list <- split(Ex, f = Ex$ID_ligne)

下面是我尝试运行的较大的函数

eq_affine <- function(x1, y1, x2, y2){
  pente <- (y2 - y1)/(x2 - x1)
  int <- y2 - pente*x2
  return(c(pente, int))

更大的功能,但出现错误消息时减少到行

 exp_lin_fun_rect <- function(xO, xS, xE, xN, 
                             yO, yS, yE, yN,
                             xcible, ycible,
                             xcompe, ycompe){

  eqSE <- eq_affin(xS, yS, xE, yE)
  eqEN <- eq_affine(xE, yE, xN, yN)
  eqNO <- eq_affine(xN, yN, xO, yO)
  eqOS <- eq_affine(xO, yO, xS, yS)
  return(data.frame(cbind(eqSE, eqEN, eqNO, eqOS)))
}

以及我尝试运行的代码:

Ex <- unlist(lapply(Ex.list, exp_lin_fun_rect))

错误信息总是Error in eq_affine(xS, yS, xE, yE) : argument "yE" is missing, with no default

不需要剩下的更大的函数,因为错误发生在代码的第一行。我使用列表是因为我有大量数据,而且这样工作更容易

感谢您的帮助

【问题讨论】:

  • 你试过Ex &lt;- unlist(lapply(Ex.list, with, exp_lin_fun_rect(xO, xS, xE, xN, yO, yS, yE, yN, xcible, ycible, xcompe, ycompe)))吗?
  • 谢谢你,它在没有 unlist 的情况下工作
  • 感谢您的反馈。很高兴我能帮上忙!

标签: r list function lapply


【解决方案1】:

稍微修改了你的代码:

# Set up original dataframe like so: 

Ex <- setNames(data.frame(rbind(C,D,E,G,H,J), stringsAsFactors = FALSE), X)

# Clean data: 

Ex <- data.frame(lapply(Ex,
       function(x) {
         if(suppressWarnings(sum(is.na(as.numeric(x)))) == sum(is.na(x))){
           x <- as.numeric(x)
         } else{
           as.character(x)
         }
       }))

# Define function:
eq_affine <- function(x1, y1, x2, y2){
  pente <- (y2 - y1)/(x2 - x1)
  int <- y2 - pente*x2
  return(c(pente, int))
}


# Define function: 
exp_lin_fun_rect <- function(xO, xS, xE, xN, yO, yS, yE, yN, xcible, ycible,
                             xcompe, ycompe){
  eqSE <- eq_affine(xS, yS, xE, yE)
  eqEN <- eq_affine(xE, yE, xN, yN)
  eqNO <- eq_affine(xN, yN, xO, yO)
  eqOS <- eq_affine(xO, yO, xS, yS)

  return(list(eqSE = eqSE, eqEN = eqEN, eqNO = eqNO, eqOS = eqOS))

}

# Apply function: 
exp_lin_fun_rect(Ex$xO, Ex$xS, Ex$xE, Ex$xN, Ex$yO, Ex$yS, Ex$yE, Ex$yN, 
                 Ex$xcible, Ex$ycible, Ex$xcompe, Ex$ycompe)

数据:

X <- c("Bloc", "Mp", "xcible",  "ycible", "xO", "yO", "xN", "yN", "xE", "yE", "xS", "yS", "ID_ligne")
C <- c("LE-01", 22, 2.404024, -39.5192, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-006-22")
D <- c("LE-01", 20, 1.362262, -40.59871, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-006-20")
E <-c("LE-01", 22, 2.404024, -39.5192, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-005-22")
G <- c("LE-01", 20, 1.362262, -40.59871, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-005-20")
H <- c("LE-01", 24, 1.710175, -33.79383, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-004-24") 
J <- c("LE-01", 22, 2.404024, -39.5192, -7.296761, -43.66444, -8.135254, -0.8619174, 6.710631, 0.20917, 7.339786, -41.44318, "LE-01-B-003-22")

【讨论】:

  • 您能解释一下为什么原始方法会导致错误消息“eq_affine(xS, yS, xE, yE) 中的错误:缺少参数“yE”,没有默认值吗?”
  • @sachin2014 首先,您还没有定义 eq_affine 函数,它缺少一个结束“}”。其次,数据框中的数据类型不正确,因此算术运算将不起作用,因为它们是因子/字符串。第三,您没有正确应用该函数,因为您没有为函数的参数提供参数。如果您发现此解决方案有用,请点赞并接受我的回答。
  • 第四,你还没有在你的 exp_lin_fun_rect 函数中定义要返回的对象。
  • @sachin2014 不用担心,如果它符合您的要求,请接受我的解决方案。
  • @sachin2014 正如我所说,我不知道为什么第一种方法会导致此错误消息。我的所有值都以数字开头,因此算术运算可能有效。
猜你喜欢
  • 2015-02-22
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 2012-08-04
  • 2021-12-27
  • 2011-07-03
相关资源
最近更新 更多