如何根据另一列

时间:2017-11-17 16:43:28

标签: r data.table

我有数据,我在列中有一个感兴趣的元素(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进行任何指导?我知道其他示例是相似的,但似乎没有一个选项指定在折叠其他列时不折叠一列中的特定变量。

3 个答案:

答案 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