我有数据,我在列中有一个感兴趣的元素(111)。我的数据看起来像这样:
pcp2 <- data.frame(A = c(rep(111, 4), rep(222, 5), rep(111,5),
rep(222,5)),B= c(rep(1,9), rep(2,10)))
A B
1 111 1
2 111 1
3 111 1
4 111 1
5 222 1
6 222 1
7 222 1
8 222 1
9 222 1
10 111 2
11 111 2
12 111 2
13 111 2
14 111 2
15 222 2
16 222 2
17 222 2
18 222 2
19 222 2
我想要折叠所有仅变量222,并根据B列中的ID保留所有111个数据,如下所示:
A B
1 111 1
2 111 1
3 111 1
4 111 1
5 222 1
6 111 2
7 111 2
8 111 2
9 111 2
10 111 2
11 222 2
我所能找到的只是关闭所有变量(111和222)。
library(data.table)
dat <- as.data.table(pcp2, key = "B")
data <- dat[, by = key(dat)][!duplicated(A == "222")]
如下:
A B
1 111 1
2 222 2
我已经玩过这个代码和其他代码的各种迭代,但我尝试过的其他事情只是把我的数据分成两行或者折叠了111和222.I.e.这还不够:
A B
1 111 1
2 222 2
3 111 2
4 222 2
有没有人对如何维护111并在一列中根据另一列(如本例中为B)折叠222进行任何指导?我知道其他示例是相似的,但似乎没有一个选项指定在折叠其他列时不折叠一列中的特定变量。
答案 0 :(得分:3)
您可以为未折叠的行添加计数器:
dat[, r := rowid(A)*(A == 111)]
unique(dat, by=c("B","r"))[, !"r"]
A B
1: 111 1
2: 111 1
3: 111 1
4: 111 1
5: 222 1
6: 111 2
7: 111 2
8: 111 2
9: 111 2
10: 111 2
11: 222 2
(这需要data.table,而Gregor的答案也适用于基数R.)
答案 1 :(得分:2)
我会说明你的目标为&#34;保留不重复的行或者A是111&#34;,并且理解第一次出现时duplicated
为FALSE。
duplicated(pcp2)
查看所有列,因此我们不必担心每个B组内的&#34;&#34;东西。如果您还有其他列,请仅提供duplicated
相关列,例如duplicated(pcp2[c("A", "B")])
。
pcp2[!duplicated(pcp2) | pcp2$A == 111, ]
# A B
# 1 111 1
# 2 111 1
# 3 111 1
# 4 111 1
# 5 222 1
# 10 111 2
# 11 111 2
# 12 111 2
# 13 111 2
# 14 111 2
# 15 222 2
答案 2 :(得分:0)
以下是使用dplyr
的{{1}}解决方案。此解决方案 假设slice
以外的A
的其他值为111
:
222
或者使用library(dplyr)
pcp2 %>%
group_by(B, A) %>%
slice(if(any(A == "111")) 1:n() else 1)
:
data.table
<强>结果:强>
library(data.table)
setDT(pcp2)[, .I[if(any(A=="111")) 1:.N else 1], by = c("B", "A")][,.SD, .SDcols = A:B]
数据:强>
# A tibble: 12 x 2
# Groups: B, A [5]
A B
<dbl> <dbl>
1 111 1
2 111 1
3 111 1
4 111 1
5 222 1
6 111 2
7 111 2
8 111 2
9 111 2
10 111 2
11 222 2
12 333 2
A B
1: 111 1
2: 111 1
3: 111 1
4: 111 1
5: 222 1
6: 111 2
7: 111 2
8: 111 2
9: 111 2
10: 111 2
11: 222 2
12: 333 2