【问题标题】:replace every value with one of another vector - dplyr用另一个向量中的一个替换每个值 - dplyr
【发布时间】:2021-09-04 10:49:08
【问题描述】:

我有一个包含两列的数据框,如下所示:

> co_purchase
    Source Target
1        0      1
2        0      2
3        0      3
4        0      4
5        0      5
6        1      0
7        1      2
8        1      4
9        1      5
10       1     15

我想用另一个向量的位置值+1中的字符一个来更改每个值。我已经尝试过了,即使它可以只替换一列:

co_purchase %>% 
  mutate(Source = recode(Source, products$group[Source + 1]))

但这会导致大多数 NA 出现以下错误:

Warning message:
Problem with `mutate()` column `Source`.
i `Source = recode(...)`.
i Unreplaced values treated as NA as .x is not compatible. Please specify replacements exhaustively or supply .default 

group 向量是这样制作的:

 [1] NA      "Book"  "Book"  "Book"  "Book"  "Book"  "Book"  "Music" "Book"  "Book"  "Book"  "Book"  "Book"  "Book"  "Music"

因此,所需的输出如下:

> co_purchase
      Source     Target
1        NA      "Book"
2        NA      "Book"
3        NA      "Book"
4        NA      "Book"
5        NA      "Book"
6      "Book"      NA
7      "Book"    "Book"
8      "Book"    "Book"
9      "Book"    "Book"
10     "Book"    "Music"

【问题讨论】:

  • 没有group 列。你能发布预期的输出吗?

标签: r dataframe dplyr data-manipulation


【解决方案1】:

我们可以直接使用base R

co_purchase$Source <- with(products, group[co_purchase$Source + 1])

或在data.table

library(data.table)
setDT(co_purchase)[, Source := products$group[Source + 1]]

【讨论】:

    【解决方案2】:

    我认为你不需要recode。试试这个 -

    library(dplyr)
    co_purchase %>% mutate(Source = products$group[Source + 1])
    

    或者在基础 R 中 -

    co_purchase$Source <- products$group[co_purchase$Source + 1]
    

    对于多列使用across -

    co_purchase %>% mutate(across(.fns = ~products$group[. + 1]))
    

    【讨论】:

    • 非常感谢!有没有办法同时做两列?
    • @Maurinho 为此使用across。请参阅我的更新答案。
    猜你喜欢
    • 2017-11-12
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    相关资源
    最近更新 更多