用R中的mutate_at覆盖很多列吗?

时间:2018-08-08 11:05:53

标签: r dataframe dplyr mutate

鉴于以下dataframe,我尝试使用具有c功能但没有运气的d来突变除dplyr::mutate_atlambda以外的所有列:

structure(list(a = c(1, 2, 3), b = c(43, 2, -1), c = c(234242, 
-223, 1), d = c(1, 1, 2)), .Names = c("a", "b", "c", "d"), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"))

df %>% mutate_at(vars(-c("c", "d"), funs(x = x + rnorm(1, mean = mean(x), sd = sd(x))

我想覆盖现有的a和b列,而无需手动进行相互变异。 请告知。

注意:我的真实数据集相似,但有50列要进行变异并添加此正态分布随机变量值。除了特定的列,我想自动化它。

3 个答案:

答案 0 :(得分:3)

您快到了。有两点需要更改:

  1. x更改为.
  2. 访问不带引号的列名:-c(c, d)而不是-c("c", "d")

这导致

df %>% mutate_at(vars(-c(c, d)), funs(. + rnorm(1, mean = mean(.), sd = sd(.))))                                    

效果很好。输出为:

# A tibble: 3 x 4
      a     b       c     d
  <dbl> <dbl>   <dbl> <dbl>
1  3.05  56.6  234242     1
2  4.05  15.6    -223     1
3  5.05  12.6       1     2

答案 1 :(得分:3)

请注意:

您可以使用:mutate_if

df1 %>% mutate_if(names(.)%in%c("a","b"), funs(. + rnorm(1, mean = mean(.), sd = sd(.))))

当然,您必须使用",因为您是在相互比较字符串。

答案 2 :(得分:1)

如果要更改的所有变量都按顺序排列,则可以在vars中对其进行索引。然后您将x更改为“。”

df %>% mutate_at(vars(a:b), funs(. + rnorm(1, mean = mean(.), sd = sd(.))))
#       a      b       c     d
# 1  3.20  34.2   234242     1
# 2  4.20  -6.85    -223     1
# 3  5.20  -9.85       1     2