dplyr 通过评估查找单元格值来改变特定列

2024-06-28

我已经使用定额、符号和求值探索了各种选项,但我似乎无法获得正确的语法。这是一个示例数据框。

data.frame("A" = letters[1:4], "B" = letters[26:23], "C" = letters[c(1,3,5,7)], "D" = letters[c(2,4,6,8)], "pastecols" = c("B, C","B, D", "B, C, D", NA))
  A B C D pastecols
1 a z a b      B, C
2 b y c d      B, D
3 c x e f   B, C, D
4 d w g h      <NA>

现在假设我想根据pastecols中的查找字符串粘贴来自不同列的值,并且我总是想包含A列。这是我想要的结果:

  A B C D pastecols  result
1 a z a b      B, C   a z a
2 b y c d      B, D   b y d
3 c x e f   B, C, D c x e f
4 d w g h      <NA>       d

理想情况下,这可以在 dplyr 中完成。这是我得到的最接近的:

x %>% mutate(result = lapply(lapply(str_split(pastecols, ", "), c, "A"), na.omit))
  A B C D pastecols     result
1 a z a b      B, C    B, C, A
2 b y c d      B, D    B, D, A
3 c x e f   B, C, D B, C, D, A
4 d w g h      <NA>          A

这是一种使用方法pmap做类似的事情。pmap通过将每一行捕获为命名向量,可用于按行有效地处理数据帧;然后您可以获得索引所需的列名称cols通过选择它们["pastecols"].

大多数匿名函数语法不是tidyverse东西,但只是基本的 R 东西。要浏览它:

  1. 将数据帧作为列表传递给.l的论证pmap_chr。请记住,数据框是列的列表!
  2. 捕获所有...争论与c(...)。基本上,我们将数据帧的每一行调用为函数的参数;现在row是包含行的命名向量。请注意,如果您有列表列,这将会破坏,(但是这里的很多其他东西也会破坏,所以我假设没有......)
  3. 我们可以得到的值row我们想要从row["pastecols"],但我们需要转向(比如说)"B, C" into c("A", "B", "C")要做到这一点。下一行仅添加"A",将缺失值替换为"A",如果有的话分成几部分,然后索引回到列表中。这[[部分只是你的做法list[[1]]"在管道链中,它是运算符的前缀形式。你需要这个因为str_split返回一个列表,我们只需要向量。
  4. 用这个cols从中获取所需值的向量row并返回它,折叠成长度为 1 的字符向量!
library(tidyverse)
tbl <- tibble("A" = letters[1:4], "B" = letters[26:23], "C" = letters[c(1,3,5,7)], "D" = letters[c(2,4,6,8)], "pastecols" = c("B, C","B, D", "B, C, D", NA))

tbl %>%
  mutate(result = pmap_chr(
    .l = .,
    .f = function(...){
      row <-  c(...)
      cols <- row["pastecols"] %>% str_c("A, ", .) %>% replace_na("A") %>% str_split(", ") %>% `[[`(1)
      vals <- row[cols] %>% str_c(collapse = ", ")
      return(vals)
    }
  ))
#> # A tibble: 4 x 6
#>   A     B     C     D     pastecols result    
#>   <chr> <chr> <chr> <chr> <chr>     <chr>     
#> 1 a     z     a     b     B, C      a, z, a   
#> 2 b     y     c     d     B, D      b, y, d   
#> 3 c     x     e     f     B, C, D   c, x, e, f
#> 4 d     w     g     h     <NA>      d

创建于 2018-12-03代表包 http://reprex.tidyverse.org(v0.2.0)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dplyr 通过评估查找单元格值来改变特定列 的相关文章

随机推荐