- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想同时对多个字符变量使用 summarise_at
和 mutate_at
。我看过很多使用整数变量的例子,但我就是想不通字符变量。正下方是我用来为字符(或因子)变量生成描述性统计信息的代码。
library(tidyverse)
# First block of code
starwars %>%
group_by(gender) %>%
summarise (n = n()) %>%
mutate(totalN = (cumsum(n))) %>%
mutate(percent = round((n / sum(n)), 3)) %>%
mutate(cumpercent = round(cumsum(freq = n / sum(n)),3))
这会产生:
A tibble: 5 x 5
gender n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 female 19 19 0.218 0.218
2 hermaphrodite 1 20 0.011 0.230
3 male 62 82 0.713 0.943
4 none 2 84 0.023 0.966
5 <NA> 3 87 0.034 1.000
我想生成同样的东西,但是一次生成多个字符(或因子)变量。在这种情况下,让我们使用变量 gender
和 eye_color
这是我尝试过的:
starwars %>%
summarise_at(vars(gender, eyecolor) (n = n()) %>%
mutate_at(vars(gender, eyecolor) (totalN = (cumsum(n))) %>%
mutate_at(vars(gender", "eyecolor) (percent = round((n / sum(n)), 3)) %>%
mutate_at(vars(gender, eyecolor) (cumpercent = round(cumsum(freq = n / sum(n)),3))))))
我收到以下错误:
Error in eval(expr, envir, enclos) : attempt to apply non-function
我知道有使用 funs
调用的内置函数,但我不想使用它们。我曾尝试以多种不同的方式使用代码来使其正常工作,但效果不佳。
我想制作的是这样的:
A tibble: 5 x 5
gender n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 female 19 19 0.218 0.218
2 hermaphrodite 1 20 0.011 0.230
3 male 62 82 0.713 0.943
4 none 2 84 0.023 0.966
5 <NA> 3 87 0.034 1.000
A tibble: 15 x 5
eye_color n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 black 10 10 0.115 0.115
2 blue 19 29 0.218 0.333
3 blue-gray 1 30 0.011 0.345
4 brown 21 51 0.241 0.586
5 dark 1 52 0.011 0.598
6 gold 1 53 0.011 0.609
7 green, yellow 1 54 0.011 0.621
8 hazel 3 57 0.034 0.655
9 orange 8 65 0.092 0.747
10 pink 1 66 0.011 0.759
11 red 5 71 0.057 0.816
12 red, blue 1 72 0.011 0.828
13 unknown 3 75 0.034 0.862
14 white 1 76 0.011 0.874
15 yellow 11 87 0.126 1.000
也许循环会更好?现在我有很多代码行来为每个字符变量生成描述性统计信息,因为我必须为每个变量运行第一个代码块(如上所述)。如果我可以列出我想使用的变量并在第一段代码中运行每个变量,那就太好了。
最佳答案
根据您的预期输出,mutate_at
不是您想要的,因为它会在所选列上发生变异。你想要做的是将 group_by
gender
和 eye_color
分开。这是将摘要代码写入函数的好地方:
library(tidyverse)
library(rlang)
summary_func = function(group_by_var){
group_by_quo = enquo(group_by_var)
starwars %>%
group_by(!!group_by_quo) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3),
cumpercent = round(cumsum(freq = n / sum(n)),3))
}
结果:
> summary_func(gender)
# A tibble: 5 x 5
gender n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 female 19 19 0.218 0.218
2 hermaphrodite 1 20 0.011 0.230
3 male 62 82 0.713 0.943
4 none 2 84 0.023 0.966
5 <NA> 3 87 0.034 1.000
> summary_func(eye_color)
# A tibble: 15 x 5
eye_color n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 black 10 10 0.115 0.115
2 blue 19 29 0.218 0.333
3 blue-gray 1 30 0.011 0.345
4 brown 21 51 0.241 0.586
5 dark 1 52 0.011 0.598
6 gold 1 53 0.011 0.609
7 green, yellow 1 54 0.011 0.621
8 hazel 3 57 0.034 0.655
9 orange 8 65 0.092 0.747
10 pink 1 66 0.011 0.759
11 red 5 71 0.057 0.816
12 red, blue 1 72 0.011 0.828
13 unknown 3 75 0.034 0.862
14 white 1 76 0.011 0.874
15 yellow 11 87 0.126 1.000
这个想法是将您的摘要代码变成一个函数,这样您就可以将相同的代码应用于不同的 group_by
变量。 rlang
中的 enquo
获取提供给 group_by_var
的代码,并将其与调用它的环境捆绑到 quosure
中.然后,您可以使用 !!
取消引用 group_by
步骤中的 group_by_quo
。这会启用非标准评估(即键入 summary_func(gender)
而不是 summary_func("gender")
。
如果你不想为你想要group_by
的每个变量调用summary_func
,你可以将你的dplyr
代码包装在map
来自 purrr
,并取消引用作为 ...
参数提供的 group_by_quo
的每个参数。请注意从 enquo
到 quos
的更改,以将 ...
的每个参数转换为 quosure
的列表:
summary_func = function(...){
group_by_quo = quos(...)
map(group_by_quo, ~{
starwars %>%
group_by(!!.x) %>%
summarise(n = n()) %>%
mutate(totalN = (cumsum(n)),
percent = round((n / sum(n)), 3),
cumpercent = round(cumsum(freq = n / sum(n)),3))
})
}
您现在可以这样做:
summary_func(gender, eye_color)
或将字符变量名称的向量用于 group_by
:
group_vars = c("gender", "eye_color")
summary_func(!!!syms(group_vars))
结果:
[[1]]
# A tibble: 5 x 5
gender n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 female 19 19 0.218 0.218
2 hermaphrodite 1 20 0.011 0.230
3 male 62 82 0.713 0.943
4 none 2 84 0.023 0.966
5 <NA> 3 87 0.034 1.000
[[2]]
# A tibble: 15 x 5
eye_color n totalN percent cumpercent
<chr> <int> <int> <dbl> <dbl>
1 black 10 10 0.115 0.115
2 blue 19 29 0.218 0.333
3 blue-gray 1 30 0.011 0.345
4 brown 21 51 0.241 0.586
5 dark 1 52 0.011 0.598
6 gold 1 53 0.011 0.609
7 green, yellow 1 54 0.011 0.621
8 hazel 3 57 0.034 0.655
9 orange 8 65 0.092 0.747
10 pink 1 66 0.011 0.759
11 red 5 71 0.057 0.816
12 red, blue 1 72 0.011 0.828
13 unknown 3 75 0.034 0.862
14 white 1 76 0.011 0.874
15 yellow 11 87 0.126 1.000
关于r - "summarise_at"和 "mutate_if"用于字符变量的描述性统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47538530/
大家好, library(dplyr) library(tibble) mtcars %>% rownames_to_column("modelle") %>% mutate_if(~is.n
我想通过 dplyr 中的 mutate_if 将 NA 值替换为零。语法如下: set.seed(1) mtcars[sample(1:dim(mtcars)[1], 5), samp
寻求一些有关如何使用 dplyr 的 mutate_if 语句来检查是否需要将列转换为因子变量的建议。 这个函数说明了我正在尝试做的事情。问题是,当我想为函数中的“max_value”参数传递一些内容
我想使用 dplyr 的 mutate_if() 函数将列表列转换为数据帧列,但当我尝试这样做时遇到了令人费解的错误。我正在使用 dplyr 0.5.0、purrr 0.2.2、R 3.3.0。 基本
我想提取 mutate_if 函数调用中的列名称。有了这个,我想在 a 中查找一个值不同的表并用查找值填充缺失值。我尝试使用 quosure 语法,但它不起作用。是否可以直接提取列名? 示例数据 df
我想根据多个条件改变列。例如,对于最大值为 5 并且列名称包含“xy”的每一列,应用一个函数。 df df xx1 xy1 xx2 xy2 1 0 0 0 0 2 1 5
真的很困惑为什么这不起作用: df % mutate_if((is.character(.) & names(.) %in% varnames), funs(mean(as
真的很困惑为什么这不起作用: df % mutate_if((is.character(.) & names(.) %in% varnames), funs(mean(as
我想同时对多个字符变量使用 summarise_at 和 mutate_at。我看过很多使用整数变量的例子,但我就是想不通字符变量。正下方是我用来为字符(或因子)变量生成描述性统计信息的代码。 lib
我想将列中的所有 NA 更改为 0。 我可以用 mutate() ,但不是 mutate_if() . 这有效: > test test %>% select_("Q3.2", "Q8.2") %>
我有超过 2000 列应该进行虚拟编码的数据。但是,偶尔会有值大于 1 的情况。所以,我想一次改变所有这些列并将大于 1 的任何内容转换为 1。这是前几列数据的片段列。 我试过使用 mutate_if
我正在我的包中创建一个通用函数。目标是找到百分比列,然后使用 parse_number如果他们是 character列。我一直无法使用 mutate_at 找到解决方案和 ifelse .我在下面粘贴
如果可能的话,我想使用 mutate_if 和 replace_na 的某种变体替换数字列中的 NA,但无法弄清楚语法。 df # A tibble: 3 x 3 #> first second
我正在使用 RPostgreSQL 从 Postgres 数据库中提取数据,它在导入 R 时将时间戳转换为系统时区。因此,导入后我想设置所有的时区UTC 时间戳。我想我可以使用 dplyr 和 lub
我有以下示例输出: country country-year year a b 1 France France2000 2000 NA NA 2 Fr
我有一个超过 100 列的数据集,但例如让我们假设我有一个数据集看起来像 dput(tib) structure(list(f_1 = c("A", "O", "AC", "AC", "AC", "O
根据 the documentation of the dplyr package : # The _if() variants apply a predicate function (a funct
我是一个狂热的 R 用户,并且正在学习 Python。我可以在 R 中轻松运行的示例代码之一让我在 Python 中感到困惑。 这是原始数据(在 R 中构建): library(tidyverse)
我认为标题相当简单。但只是提供一些数据和示例: test % gather_if(is.numeric, 'key', 'value') ?这将给出与以下相同的输出: > test %>% gathe
我是一名优秀的程序员,十分优秀!