我有一个数据文件,例如:
Groups Element
G1 E1
G2 E1
G1 E2
G1 E3
G1 E4
G1 E5
G2 E5
G2 E5
G2 E6
G1 E6
G1 E7我想创建一个名为Element2 for G1和G2 groups的新列,它只有在G1和G2组E 210中才具有元素值。
然后我应该得到:
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以下是表格的dput格式(如果可以的话):
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))发布于 2022-05-10 08:19:51
您可以在组match和G2元素的intersect上使用G1。
. <- 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")发布于 2022-05-10 08:24:55
使用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>发布于 2022-05-10 08:44:42
您可以尝试下面的代码
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>https://stackoverflow.com/questions/72182770
复制相似问题