【问题标题】:R: subset a dataframe by factor levels with a second conditionR:使用第二个条件按因子级别子集数据帧
【发布时间】:2017-08-23 15:28:37
【问题描述】:

我希望创建在某些条款中出现的 Contact.ID 的子集,而不是在其他条款中。

为了更好地解释,这是我的数据集的快照:

df <- c(Contact.ID, Date.Time, Age, Gender, Attendance)

Contact.ID       Date    Time    Age   Gender   Attendance   Term 
1   A       2012-10-06 18:54:48   37    Male         30      Term1
2   A       2013-03-12 20:50:18   37    Male         30      Term2
3   A       2013-05-24 20:18:44   37    Male         30      Term3
4   B       2012-11-15 16:58:15   27  Female         40      Term1 
5   B       2012-12-23 10:57:02   27  Female         40       WB
6   B       2013-01-11 17:31:22   27  Female         40      Term2
7   B       2013-02-18 18:37:00   27  Female         40      Term2
8   C       2013-02-22 17:46:07   40    Male         5       Term2
9   C       2013-02-27 11:21:00   40    Male         5       Term2
10  D       2012-10-28 14:48:33   20  Female         12      Term1

我的问题是,我需要根据 Contact.ID 创建进一步的细分

所以我要创建的组是:

  • 仅术语 1 --> 仅存在于术语 1 中但不存在于任何其他术语中的 ID(例如 ID D)

  • 仅术语 2 ---> 仅存在于术语 2 中但不存在于任何其他术语中的 ID(例如 ID C)

  • 术语 1 和 2 --> 仅在术语 1 和 2 中而不是术语 3 中的 ID(例如 ID B)

  • 术语 1 & 2 & 3 --> 存在于所有术语中的 ID(例如 ID A)

我尝试了向subset 添加条件的不同方法,还尝试了df[ which ()] 之类的函数和subset(df, () &amp; () &amp; !()),但我似乎无法正确处理。

有什么建议吗?我真诚地感谢您的帮助。

【问题讨论】:

  • 你可以在第一学期尝试intersect(!(Term1$Contact.ID %in% Term2$Contact.ID), !(Term1$Contact.ID %in% Term3$Contact.ID))之类的独占。等等。
  • 如果无法轻松重现您的示例,这很难提供帮助,但是您是否尝试过根据您为 Term1、2、3 设置的条件在数据框中创建一个标志变量? (例如,创建一个新列,其中 1 = term1 时间范围内的所有行,2 = term2 时间范围内的所有行等)然后您应该也可以轻松地进行子集化。它还会阻止您拥有许多数据帧。
  • @abhiieor 感谢您的建议!不幸的是,这只会创建一个 value of 'logi [1 : 2] False True`,所以它似乎不起作用。
  • @Sheila,不,我还没有尝试过!好想法!我现在就试一试。
  • @Sheila,嘿,我已经设法创建了一个新列来定义日期所属的术语,但我仍然坚持如何定义下一步。现在我只有一个额外的列来说明第一个区别,但是我有太多的 ID 无法手动描述下一步......有什么想法吗?

标签: r subset


【解决方案1】:

所以我不知道 WB 在您的数据集中是什么,但我认为您可以按照此代码填写您要查找的内容。我们基本上只需要过滤每个 Contact.ID 所在的唯一数量的术语,然后确保这些术语是正确的。我没有将“WB”视为术语之一,因为它看起来不像您。

library(data.table)

dat = read.table("clipboard", header = TRUE)
setDT(dat)

dat[ , 'Num_Unique_Terms' := uniqueN(Term[Term != "WB"]), by = Contact.ID]

term1 = dat[Num_Unique_Terms == 1 & Term == "Term1"]
term2 = dat[Num_Unique_Terms == 1 & Term == "Term2"]
terms12and3 = dat[Num_Unique_Terms == 3]


dat[ , 'All_1_or_2' := ifelse(all(Term[Term != "WB"] %in% c("Term1", "Term2")), 1, 0), by = Contact.ID]
dat[ , 'All_2_or_3' := ifelse(all(Term[Term != "WB"] %in% c("Term2", "Term3")), 1, 0), by = Contact.ID]

term1and2 = dat[All_1_or_2 == 1 & Num_Unique_Terms == 2]
term2and3 = dat[All_2_or_3 == 1 & Num_Unique_Terms == 2]

【讨论】:

  • 嘿@Kristofersen,非常感谢!这似乎有效,但为了确保有效,我尝试创建所有可能的组,以查看我的 ID 计数是否加起来,我遇到了一个难题:在创建 term1、term2、term3、term1and2 和 term1and2and3 之后,我尝试过创建term2and3,但我似乎无法正确理解该行。你能帮忙吗?
  • 非常感谢您的帮助!!我仍然没有做对。基本上,我有 6593 个科目(Contact.ID)。当我创建不同的子集时,我得到 term1(964 ID's)、term2(776ID's)、term3(490ID's)、term1&2&3(2,674ID's)、term1&2(1,689ID's) 和 term2&3(1,689ID's)。这超出了我的 ID 计数 1,689,并且由于组是独占的,因此应该正好是 6593。term2 和 3 值仅在 term2 中有许多主题,这是错误的。我以为我没有正确创建子集,但我确实有和你一样的代码..知道我的错误可能在哪里吗?再次感谢您的帮助!
  • WB 只是另一个小节,类似于“term4”,但我通过扩展我的第 1、2 和 3 个参数来删除它们。
  • 抱歉,您的意思是什么? 'Num_Unique_Terms' 值?它们都是 1、2 或 3,具体取决于我们在给定的 data.frame 中选择的内容
  • 两种方法我都试过了,结果都一样
猜你喜欢
  • 1970-01-01
  • 2014-02-11
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多