鉴于以下dataframe
,我尝试使用具有c
功能但没有运气的d
来突变除dplyr::mutate_at
和lambda
以外的所有列:
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列要进行变异并添加此正态分布随机变量值。除了特定的列,我想自动化它。
答案 0 :(得分:3)
您快到了。有两点需要更改:
x
更改为.
-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