我有一个包含这些列的大型数据框:“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(...)
由于
答案 0 :(得分:1)
首先,交叉制表id
和role
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