【问题标题】:Subset panel data with more than one match for a criteria over multiple columns子集面板数据与多个列上的条件有多个匹配项
【发布时间】:2021-01-24 15:40:27
【问题描述】:

我有这样的个人数据:

df=data.frame(Col1=c("A","A","B","B"),Col2=c("A50","C50","B60","A70"),Col3=c("A40","A50","A50","A70"))
criteria="A50"

  Col1 Col2 Col3
    A  A50  A40
    A  C50  A50
    B  A50  A50
    B  A70  A70

我想在两个不同的观察值的任何列中选择Col1 中满足criteria (A50) 的每个人。也就是说,将选择个人A,因为他在两个不同的观察中拥有A50。然而,个人B不会被选中,因为他在一次观察中只有A50,即使在观察期间他两次成为A50

问题是这个扩展:Subset multiple columns in R with multiple matches

【问题讨论】:

  • 您总共要检查多少列?
  • 我在真实数据中有15列!我有一个这样的向量:cols <- c("state1", "state 2", "state3").

标签: r panel-data


【解决方案1】:

尝试将其与dplyr 1.0.0 一起使用

library(dplyr)

cols <- c('Col2', 'Col3') 

df %>%
  group_by(Col1) %>%
  filter(sum(colSums(cur_data()[cols] == criteria) >= 1) > 1)

#  Col1  Col2  Col3 
#  <chr> <chr> <chr>
#1 A     A50   A40  
#2 A     C50   A50  

cur_data()[cols] 仅选择 cols 列,colSums 计算每列中的匹配数,sum 确保匹配位于不同列中。

【讨论】:

  • 嗯,当我在真实数据上运行该代码时,我只是得到一个空数据框。
  • 适用于您共享的数据。那你能分享一个有代表性的样本吗?
  • 确实如此......我不能,因为数据是机密的:但它是一个带有个人 ID(整数)的列和 15 个带有状态的列(char)(如 X300 )。每个人在数据中可能出现 15 次左右。
  • 啊!第 11-15 列的格式为 logi。我的错。谢谢,您的解决方案运行良好!
【解决方案2】:

这是一个基本的 R 选项

u <- sapply(
  split(as.data.frame(df[-1] == criteria), df$Col1),
  function(x) all(rowSums(x) > 0) & all(colSums(x) > 0)
)
subset(df, Col1 == names(u)[u])

给了

  Col1 Col2 Col3
1    A  A50  A40
2    A  C50  A50

【讨论】:

    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 2014-09-11
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2014-04-01
    相关资源
    最近更新 更多