R - 子集类别

时间:2014-07-09 13:38:36

标签: r subset

我有一个包含这些列的大型数据框:“id”和“role”。 id列不是唯一的,角色是X或Y.

可重复的例子:

Data <- data.frame(
  'id' = sample(1:30, 100, replace=T),
  'role' = sample(c("X", "Y"), 100, replace =T)
)

以下是数据示例:

>head(Data):
      id role
    1 28    X
    2 11    Y
    3  1    Y
    4 30    X
    5 27    Y
    6  3    Y

我知道我可以得到这样一个子集:

subset(Data, Role == 'X')

由于ID被重复 - 有时候角色不同 - 我希望能够做一些只有X的人,只有Y的人,以及那些同时具有以下伪代码的角色的人:

Only_X_Role = subset(...)
Only_Y_Role = subset(...)
Both_X_and_Y_Roles = subset(...)
  • 我该怎么做?

由于

2 个答案:

答案 0 :(得分:1)

首先,交叉制表idrole s:

xtab <- with(Data,table(id,role))

然后,subset id - 分别为id个没有&#34; X&#34;作用:

Only_X_Role <- subset(Data,id %in% rownames(xtab)[xtab[,"X"]==0])

然后对于id没有&#34; Y&#34;作用:

Only_Y_Role <- subset(Data,id %in% rownames(xtab)[xtab[,"Y"]==0])

最后,对于同时具有这两种角色的id - 或xtab中的行没有零:

Both_X_and_Y_Roles <- subset(Data,id %in% rownames(xtab)[rowSums(xtab==0)==0])

答案 1 :(得分:1)

我会做类似的事情(这样你就不需要指定实际的role值了,因此理论上你可以在role中有更多不同的值,这段代码仍能正常工作)

library(reshape2)
Data2 <- dcast(Data, id ~ role)
Data2 <- data.frame(id = Data2[, 1], apply(Data2[, -1], 2, function(x) as.numeric(x > 0)))
list2env(split(Data2, Data2[, -1]), .GlobalEnv)

这将创建3个名为:

的数据集
`1.0`, `0.1`, `1.1`

例如

`1.0`
##    id X Y
## 13 13 1 0
## 16 16 1 0
## 17 17 1 0
## 21 21 1 0