【问题标题】:How to filter a dataframe based on values in another dataframe in R如何根据 R 中另一个数据框中的值过滤数据框
【发布时间】:2021-11-22 18:48:22
【问题描述】:

我有两个数据框,但无法根据另一个数据框的值进行过滤。

例子:

df1 有一堆列,但 A 列是最重要的,因为它对应于 df2 中的值。 A 列如下所示:

A
1
5
1
5
1

df2 看起来像这样:

A B
1 0.92
5 0.02
1 0.18
5 0.87
1 0.46

对于 df1 中每一行中的 A 值,我想找到 B(在 df2 中)高于 0.5 的次数除以该行的 A 值出现在 df2 中的次数。所以在 df1 中,我想要一个名为 C 的新列,在本例中如下所示:

C
0.33
0.5
0.33
0.5
0.33

我的尝试代码如下:

df1$C <- (df2 %>% filter(A == df1$A & B > 0.5) %>% summarize(n()))/(df2 %>% filter(A == df1$A) %>% summarize(n()))

如果我尝试这样做,但将 df1$A 替换为任意数字而不是参考,它工作正常。但是,当我尝试对 df1 中的每一行使用引用时,我收到一条错误消息。

【问题讨论】:

    标签: r filter dplyr


    【解决方案1】:

    您需要将它们按A 分组,然后我们可以使用双inner_join。

    数据:

    df1 <- data.frame(A=c(1,5,1,5,1))
    df2 <- data.frame(A=c(1,5,1,5,1), B=c(0.92,0.02,0.18,0.87,0.46))
    

    解决方案:

    df1 %>%
      inner_join(df2 %>% 
                   filter(A == df1$A & B > 0.5) %>%
                   group_by(A)%>%
                   summarize(count=n())) %>%
      inner_join(df2 %>% 
                   filter(A == df1$A) %>%
                   group_by(A)%>%
                   summarize(A_count=n())) %>%
      mutate(C= count/A_count) %>%
      select(A,C)-> df1
    

    输出:

     A         C
    1 1 0.3333333
    2 5 0.5000000
    3 1 0.3333333
    4 5 0.5000000
    5 1 0.3333333
    

    【讨论】:

    • 刚刚插入并收到以下错误:错误:filter() 输入问题..1。 i 输入..1 是&amp;...。 x 输入 ..1 的大小必须为 3684 或 1,而不是 37957。运行 rlang::last_error() 以查看错误发生的位置。另外:警告消息:1:在 A == df1$A:较长的对象长度不是较短对象长度的倍数
    • 对于它的价值,这与我尝试使用原始代码时遇到的错误相同
    • 我又试了一次,得到了想要的输出。做一件事,只需清除您的环境并根据我提供的数据运行整个代码。你不应该有更多的问题。
    • @fdafda12 你试过了吗?你得到结果了吗?
    • 对延迟响应表示歉意,有一些计算机问题使我无法访问该问题。这有效,但仅当 df1 和 df2 的长度相等时;如果我们扩展 df2 以包含更多数据(在我的实际数据集中就是这种情况),那么我会收到错误消息。
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多