替换单元格值,匹配列表元素并切换对

Sha*_*hin 3 r dplyr

我有一个重复的列表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)
  names values
1     a      0
2     1      0
3     x      0
4     y      0
Run Code Online (Sandbox Code Playgroud)

我想用 l1 列表中的对替换这些名称的任何出现。df 所需的输出将是:

  names values
1     b      0
2     2      0
3     y      0
4     x      0
Run Code Online (Sandbox Code Playgroud)

Sot*_*tos 7

以矢量化方式执行此操作的一个想法是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)

  • 最后一行的替代方案:`i1[i2 + c(-1,1)[(i2 %% 2) + 1L]]` (2认同)