【问题标题】:Threshold for R DPLYRR DPLYR 的阈值
【发布时间】:2020-07-01 19:20:58
【问题描述】:

我有一张这样的桌子:

Task_ID |  Home_Id  |  Pet_Id  |  
----------------------------------
 10000    | 1203010   | 123      | 
 1010     | 3402034   | 120      | 
 43240    | 1239502   | 101      | 
 43240    | 1230102   | 101      | 
 43240    | 1234020   | 98       | 
 10000    | 1203010   | 123      |
 10000    | 1203010   | 123      |

对于每个任务,我想获取至少出现在 50% 家庭中的宠物列表 例如,如果有 10 行任务 id 为 1000,并且 pet_id 出现在任务 10000 中 home_id 的 5/10 中,我想标记它。

对于我的最终结果,我想获取出现在 50% 家庭中的每个 Task_Id 的 Pet_Id。

预期输出:

Task_ID |  Pet_Id  |  
--------------------
 10000  |123       | 
 1010   |120       |
 432420 |101       |

如何在 R 中做到这一点?

我想我可以按 InspectionTaskName 分组并做一些总结吗?不知道如何开始。

【问题讨论】:

  • 已更新。这更有意义吗?

标签: r tidyverse


【解决方案1】:

这里是base R 使用tablestack 的选项。逻辑是通过'Task_ID'到split除'Task_ID'之外的数据列,用lapply循环listsplit输出),得到数据集的table(假设只有两列 - 'Home_Id', 'Pet_Id'),找出逻辑矩阵与colMeans的比例,将比例大于0.5的namesstack提取到两列data.frame

stack(lapply(split(df1[-1], df1$Task_ID),
     function(x) names(which(colMeans(table(x) > 0) > 0.5))))[2:1]
#    ind values
#1  1010    120
#2 10000    123
#3 43240    101

或者使用tidyverse,按'Task_ID'、'Pet_Id'分组后,按比例得到'Home_Id'和filter的不同元素个数

library(dplyr)
df1 %>%
   group_by(Task_ID, Pet_Id)  %>% 
   dplyr::summarise(n = n_distinct(Home_Id)) %>%
   filter( n/sum(n) > 0.5) %>%
   select(-n)
# A tibble: 3 x 2
# Groups:   Task_ID [3]
#  Task_ID Pet_Id
#    <int>  <int>
#1    1010    120
#2   10000    123
#3   43240    101

数据

df1 <- structure(list(Task_ID = c(10000L, 1010L, 43240L, 43240L, 43240L, 
10000L, 10000L), Home_Id = c(1203010L, 3402034L, 1239502L, 1230102L, 
1234020L, 1203010L, 1203010L), Pet_Id = c(123L, 120L, 101L, 101L, 
98L, 123L, 123L)), class = "data.frame", row.names = c(NA, -7L
))

【讨论】:

  • 我喜欢你的 dplyr 版本。你删除了它,但你在总结中的n 基本上给了我预期的百分比分子。我只需要分母,即 home_ids 的总数
  • n/sum(n) 总是给我 1
  • @Eisen 任何机会您将plyrdplyr 一起加载会导致summarisemutate 被屏蔽
  • @Eisen 尝试使用 dplyr::summarise(n = n_distinct(Home_Id)) 明确
  • 那行不通。当您按 Task_Id 和 Pet_Id 分组时,您总结中的 n 将为我提供段落 id 在每个 home_id 中出现的次数。我需要将其除以 home_ids 的总数以获得我可以过滤掉的速率
猜你喜欢
  • 1970-01-01
  • 2020-12-28
  • 2018-07-31
  • 1970-01-01
  • 2015-04-26
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
相关资源
最近更新 更多