【问题标题】:Filtering data frame depending on another data frame根据另一个数据框过滤数据框
【发布时间】:2023-03-12 19:37:01
【问题描述】:

我有两个数据框 df 和 df2。我想通过过滤df2在df中生成一个新列,这样过滤器就依赖于df。相反,可以使用 for 循环,但这对于大数据帧来说非常慢......请查看代码。 提前非常感谢

法比安

#generating dummy data frames
df <- data.frame("var1" = 0:15)
df2 <- data.frame("var2" = 11:20, "var3" = 21:30)

# the following command unfortunatelly does not work
df$new_column <- df2 %>% filter(var2 > df$var1) %>% mean(var3)

# that's the output I want - but without a for-loop 
for (i in 1:length(df$var1)){
  h <- df2 %>% filter(var2 > df$var1[i])
  df$new_column[i] <- mean(h$var3)
}

【问题讨论】:

    标签: r dataframe filtering


    【解决方案1】:

    我们可以使用sapply,让df2中的所有值都大于var1中的每个值,并取其中的mean

    df$new_column <- sapply(df$var1, function(x) 
                     mean(df2$var3[df2$var2 > x], na.rm = TRUE))
    df
    
    #   var1 new_column
    #1     0       25.5
    #2     1       25.5
    #3     2       25.5
    #4     3       25.5
    #5     4       25.5
    #6     5       25.5
    #7     6       25.5
    #8     7       25.5
    #9     8       25.5
    #10    9       25.5
    #11   10       25.5
    #12   11       26.0
    #13   12       26.5
    #14   13       27.0
    #15   14       27.5
    #16   15       28.0
    

    或者同样可以使用map_dbl from purrr

    df$new_column <- purrr::map_dbl(df$var1,
                      ~mean(df2$var3[df2$var2 > .x], na.rm = TRUE))
    

    【讨论】:

    • 太好了,非常感谢。这(在我的具体情况下)比使用 for 循环的解决方案快大约 5 倍!
    猜你喜欢
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 2021-12-18
    • 2018-03-08
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2014-12-27
    相关资源
    最近更新 更多