如果按 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
我想为 G1 和 G2 组[=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")
使用 intersect
和 case_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>
我有一个数据框,例如:
Groups Element
G1 E1
G2 E1
G1 E2
G1 E3
G1 E4
G1 E5
G2 E5
G2 E5
G2 E6
G1 E6
G1 E7
我想为 G1 和 G2 组[=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")
使用 intersect
和 case_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>