有没有一种方法可以为每个lapply调用更新参数?

时间:2019-11-04 14:06:18

标签: r dataframe lapply

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

我已经使用过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或任何其他方法来实现,还是应该更改函数?

1 个答案:

答案 0 :(得分: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
相关问题