如果按 R 中的组在另一列中重复,则从列中添加元素

Add element from column if duplicate in another column by groups in R

我有一个数据框,例如:

Groups Element 
G1     E1
G2     E1
G1     E2
G1     E3
G1     E4
G1     E5
G2     E5
G2     E5
G2     E6
G1     E6
G1     E7

我想为 G1G2 组[=26= 创建一个名为 Element2 的新列],只有当该元素在 G1 和 G2 组 .

中时,才会具有 元素值

然后我应该得到:

Groups Element Element2
G1     E1      E1
G2     E1      E1
G1     E2      NA
G1     E3      NA
G1     E4      NA
G1     E5      E5
G2     E5      E5
G2     E5      E5
G2     E6      E6
G1     E6      E6
G1     E7      NA

这里是 table 的输出格式,如果有帮助的话:

structure(list(Groups.Element = c("G1     E1", "G2     E1", "G1     E2", 
"G1     E3", "G1     E4", "G1     E5", "G2     E5", "G2     E5", 
"G2     E6", "G1     E6", "G1     E7")), class = "data.frame", row.names = c(NA, 
-11L))

您可以在组 G1 和 G2 的元素的 intersect 上使用 match

. <- with(split(x$Element, x$Groups), intersect(G1, G2))
x$Element2 <- .[match(x$Element, .)]
x
#   Groups Element Element2
#1      G1      E1       E1
#2      G2      E1       E1
#3      G1      E2     <NA>
#4      G1      E3     <NA>
#5      G1      E4     <NA>
#6      G1      E5       E5
#7      G2      E5       E5
#8      G2      E5       E5
#9      G2      E6       E6
#10     G1      E6       E6
#11     G1      E7     <NA>

数据:

x <- read.table(header=TRUE, text="Groups Element 
G1     E1
G2     E1
G1     E2
G1     E3
G1     E4
G1     E5
G2     E5
G2     E5
G2     E6
G1     E6
G1     E7")

使用 intersectcase_when

library(dplyr)
u <- Reduce(intersect, split(dat$Element, dat$Groups))

dat %>% 
  mutate(Element2 = case_when(Element %in% u ~ Element))

   Groups Element Element2
1      G1      E1       E1
2      G2      E1       E1
3      G1      E2     <NA>
4      G1      E3     <NA>
5      G1      E4     <NA>
6      G1      E5       E5
7      G2      E5       E5
8      G2      E5       E5
9      G2      E6       E6
10     G1      E6       E6
11     G1      E7     <NA>

您可以试试下面的代码

transform(
    df,
    Element2 = Element[ave(match(Groups, Groups), Element, FUN = var) > 0]
)

这给出了

   Groups Element Element2
1      G1      E1       E1
2      G2      E1       E1
3      G1      E2     <NA>
4      G1      E3     <NA>
5      G1      E4     <NA>
6      G1      E5       E5
7      G2      E5       E5
8      G2      E5       E5
9      G2      E6       E6
10     G1      E6       E6
11     G1      E7     <NA>