首页 > 解决方案 > 嵌套子集

问题描述

我有以下数据框

Library(dplyr)    
ID <- c(1,1,1,2,2,2,2,3,3)
Tag <- c(1,2,6,1,3,4,6,4,3)
Value <- c(5,9,3,3,5,6,4,8,9)
DF <- data.frame(ID,Tag,Value)

  ID Tag Value
1  1   1     5
2  1   2     9
3  1   6     3
4  2   1     3
5  2   3     5
6  2   4     6
7  2   6     4
8  3   4     8
9  3   3     9

我想执行以下操作 1)按行 ID 分组 2)将对应于特定标记的值分配给新列。在以下示例中,我将标记 6 的值按 ID 分配给新列

  ID Tag Value New_Value 
1  1   1     5         3
2  1   2     9         3
3  1   6     3         3
4  2   1     3         4
5  2   3     5         4
6  2   4     6         4
7  2   6     4         4
8  3   4     8         NA
9  3   3     9         NA

据我所知,我需要对每个组中的数据进行子集化以获得标记 6 的值。这是我的代码和错误消息

DF %>% group_by(ID) %>% mutate(New_Value = select(filter(.,Tag==6),Value))
Adding missing grouping variables: `ID`
Error: Column `New_Value` is of unsupported class data.frame

另一种可能的解决方案是使用标签 6 的 ID 和值创建一个新数据框,并将其与 DF 连接。但是,我相信仅使用 dplyr 会有更好的通用解决方案。

如果您能帮助我了解如何在这种情况下执行嵌套子集,我将不胜感激

谢谢

标签: rdplyrtidyverse

解决方案


假设Tag在组内是唯一的,您可以这样做:

library(dplyr)

DF %>%
  group_by(ID) %>%
  mutate(New_Value = ifelse(any(Tag == 6), Value[Tag == 6], NA))

# A tibble: 9 x 4
# Groups:   ID [3]
     ID   Tag Value New_Value
  <dbl> <dbl> <dbl>     <dbl>
1     1     1     5         3
2     1     2     9         3
3     1     6     3         3
4     2     1     3         4
5     2     3     5         4
6     2     4     6         4
7     2     6     4         4
8     3     4     8        NA
9     3     3     9        NA

推荐阅读