【问题标题】:Is there a way to update argument for each call of lapply?有没有办法为每次调用 lapply 更新参数?
【发布时间】:2019-11-04 14:06:18
【问题描述】:

我正在使用一个函数来更新我的数据帧,第一个参数是我要更新的数据帧,第二个是另一个数据帧,它允许我更新第一个数据帧,第三个参数是一个整数。

我已经使用了 lapply 和其他类似的功能,但在这种情况下,我很难实现我想要的。

这是我的数据框的示例:

df <- data.frame("Fa" = c("a", "b", "c", "a"),
                 "P" = c(1, 2, 3, 4), stringsAsFactors = FALSE)

其他数据框也一样:

df2 <- data.frame("CF" = c("a", "b", "c"),
                  "R" = c(1, 2, 3),
                  "ND" = c(1, 2, 3),
                  "DD" = c(1, 2, 3),
                  "DF" = c(1, 2, 3),
                  "NF" = c(1, 2, 3),
                  "AAA" = c(1, 2, 3),
                  "BBB" = c(1, 2, 3),
                  "CCC" = c(1, 2, 3),
                  "DDD" = c(1, 2, 3),
                  "EEE" = c(1, 2, 3),
                  "FFF" = c(1, 2, 3),
                  "S" = c(1, 2, 3), stringsAsFactors = FALSE)

我正在使用的功能:

my_function <- function(x, y, nb) {
  x[which(x$Fam == as.character(y[nb, "CF"])), "PR"] <- x[which(x$Fam == as.character(y[nb, "CF"])), "P"] * (1 - as.double(y[nb, "R"]))
  x[which(x$Fa == as.character(y[nb, "CF"])), "R"] <- y[nb, "R"]
  x[which(x$Fa == as.character(y[nb, "CF"])), "ND"] <- y[nb, "ND"]
  x[which(x$Fa == as.character(y[nb, "CF"])), "DD"] <- y[nb, "DD"]
  x[which(x$Fa == as.character(y[nb, "CF"])), "DF"] <- y[nb, "DF"]
  x[which(x$Fa == as.character(y[nb, "CF"])), "NF"] <- y[nb, "NF"]
  x[which(x$Fa == as.character(y[nb, "CF"])), "S"] <- y[nb, "S"]
  return (x)
}

函数使用示例:

df <- my_function(df, df2, 1)
df <- my_function(df, df2, 2)
df <- my_function(df, df2, 3)

基本上我的目标是避免多次调用我的函数,所以更清楚为什么我做了 3 次,因为在我的数据帧“df2”中我有 3 行。所以我想知道这是否可以通过使用 lapply 或任何其他方法来实现,或者我应该改变我的功能吗?

【问题讨论】:

    标签: r dataframe lapply


    【解决方案1】:

    看起来你需要一个左连接和mutate

    library(dplyr)
    left_join(df, df2, by  = c("Fa" = "CF")) %>% 
      mutate(PR = P*(1 - R))
    #>   Fa P R ND DD DF NF S PR
    #> 1  a 1 1  1  1  1  1 1  0
    #> 2  b 2 2  2  2  2  2 2 -2
    #> 3  c 3 3  3  3  3  3 3 -6
    #> 4  a 4 1  1  1  1  1 1  0
    

    【讨论】:

    • 谢谢你的回答,但我不能真正使用像合并这样的函数,我只是用了一个例子,但在我的函数中,我也在做另一个不能用合并函数实现的操作
    • @Arkning 在这种情况下,您能否更新您的示例,以便很明显为什么 join 不起作用?否则很难给你任何建议
    • @Arkning 看起来无论如何你都应该以left_join 开头。 mutate 能解决你的问题吗?
    • 尽管我想学习另一种方法,但它确实有效,非常感谢您的帮助。
    • 在加入数据时是否可以更改某些列名?
    猜你喜欢
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多