R:通过具有第二条件的因子水平子集数据帧

时间:2017-08-23 15:28:37

标签: r subset

我希望在某些条款中创建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项 - &gt; ID仅出现在第1学期但未出现在任何其他学期(例如ID D)

  • 仅限第2项---&gt; ID仅出现在第2学期但未出现在任何其他学期(例如ID C)

  • 第1及第1期2 - &gt; ID仅在第1和第2项而不是第3项(例如,ID B)

  • 第1及第1期2&amp; 3 - &gt;所有条款中都存在的ID(例如ID A)

我尝试过为subset添加条件的不同方法,还尝试了df[ which ()]种函数和subset(df, () & () & !()),但我似乎无法正确使用它。

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

1 个答案:

答案 0 :(得分: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]