我有一个重复的列表l1 <- list(c("a","b"), c("1","2"),c("x","y"))。还有一个数据框:
df <- structure(list(names = structure(c(2L, 1L, 3L, 4L), .Label = c("1",
"a", "x", "y"), class = "factor"), values = c(0, 0, 0, 0)), class = "data.frame", row.names = c(NA,
-4L))
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)names values 1 a 0 2 1 0 3 x 0 4 y 0
我想用 l1 列表中的对替换这些名称的任何出现。df 所需的输出将是:
Run Code Online (Sandbox Code Playgroud)names values 1 b 0 2 2 0 3 y 0 4 x 0
以矢量化方式执行此操作的一个想法是unlist我们的列表(假设我们总是有对),并将match其与 df 列一起使用。然后我们处理返回的索引match如下:
如果是奇数,则保持原样。如果是偶数,则减去 2,因为它指的是该对的第二个元素。然后我们加 1 来得到另一个元素的索引。我们最终使用这些索引来过滤我们的列表,即
i1 <- unlist(l1)
i2 <- match(df2$names, i1)
i1[replace(i2, i2 %% 2 == 0, (i2 - 2)[i2 %% 2 == 0]) + 1]
#another slick way of writing the above can be i1[i2 + c(-1,1)[(i2 %% 2) + 1L]]
#courtesy of @Jaap
#[1] "b" "2" "y" "x"
Run Code Online (Sandbox Code Playgroud)