gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:26:50 31 4
gpt4 key购买 nike

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

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 东西。要遍历它:

  • 将数据帧作为列表传递给 .l pmap_chr 的论据.请记住,数据框是列列表!
  • 捕获所有 ...c(...) 的参数.基本上我们将数据帧的每一行作为函数的参数调用;现在 row是包含行的命名向量。请注意,如果您有列表列,这将中断,(但这里的许多其他内容也会中断,因此我假设没有任何...)
  • 我们可以得到 row 的值我们想要的来自 row["pastecols"] ,但我们需要转(比如说)"B, C"进入 c("A", "B", "C")要做到这一点。下一行只是添加了 "A" , 用 "A" 替换缺失值, 如果有的话,分成几块,然后索引回到列表中。 [[部分就是你如何做 list[[1]]"在管道链中,它是操作符的前缀形式。你需要这个是因为 str_split返回一个列表,我们只想要向量。
  • 用这个 colsrow 获取所需值的向量并返回它,折叠成长度为 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 由 reprex package (v0.2.0)。

    关于r - dplyr 通过评估查找单元格值来改变特定列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53599684/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com