【问题标题】:How to add to each column of dataframe value from named vector?如何从命名向量添加到数据框值的每一列?
【发布时间】:2019-05-08 15:14:16
【问题描述】:

我有一个数据框 df。

df <- data.frame(c(4,4,4,4,4,4), c(0,0,0,0,0,0))
colnames(df) <- c("a", "b")
> df
     a   b
1    4   0
2    4   0
3    4   0
4    4   0
5    4   0
6    4   0

还有一个命名向量 v,其中名称对应于我的数据框中的列名。

v <- c(0.04, 0.01)
names(v) <- c("a", "b")
> v
      a       b 
   0.04    0.01 

我的数据框中可以有很多列,向量总是有相应的名称。

我想从相应的向量中添加到列值的每个元素,所以我得到这样的结果:

> df
     a      b
1    4.04   0.01
2    4.04   0.01
3    4.04   0.01
4    4.04   0.01
5    4.04   0.01
6    4.04   0.01

我怎样才能用 dplyr 做到这一点? 到目前为止,我想出的只是

df %>% mutate_all(. = . + v[.])

但这给了我一个错误。

Error in mutate_all(., . = . + v[.]) : 
  argument 2 matches multiple formal arguments

问题是我不知道如何指出对应的列应该被对应的向量改变。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用base R(假设列的顺序相同)

    df + v[col(df)]
    

    或使用tidyverse

    library(purrr)
    map2_df(df, v[names(df)], `+`)
    

    注意:mutate_all 循环遍历“df”的列,但“v”不是这种情况。没有使用mutate_all选择与“df”中的列对应的“v”元素的索引@

    【讨论】:

    • 更好df[names(v)]&lt;-Map("+",df[names(v)],v)。如果向量名称和数据框名称的顺序不同,您将在此处失败。
    • 我知道这很简单,但没想到会这么简单。谢谢你。有什么方法可以像我的示例中那样通过管道传输它吗?
    • @АндрійzOFsky 你可以做df %&gt;% map2_df(v[names(df)], "+")
    【解决方案2】:

    这应该作为一般情况起作用:

    library(tidyverse)
    
    df <-
      tibble(
        a = rep(4, 6),
        b = rep(0, 6)
      )
    
    v <- c(0.04, 0.01)
    names(v) <- c("a", "b")
    
    v_df <- 
      v %>% 
      enframe() %>% 
      transmute(name, v_value = value)
    
    df %>% 
      gather(key = name, value = value, a:b) %>% 
      left_join(v_df, by = "name") %>% 
      transmute(name, new_value = value + v_value)
    

    然后,如果您希望将数据恢复为原始格式,您可以重新展开数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 2018-05-01
      • 1970-01-01
      相关资源
      最近更新 更多