我想使用dplyr+ 滞后函数复制以下公式 R。代码工作到每组的第二行,然后继续给我 0
预测 = 滞后(价值,1)*(1-滞后(损耗)/52)
状况:
我从第 3 行开始得到 0。下面是我的复制代码。
data <- data %>% group_by(Patch) %>% mutate(id = row_number())
data <- data %>% group_by(Patch) %>% mutate(forecast = lag(Value,1)*(1-lag(Attrition,1)/52))
tbl_df(data)
# A tibble: 12 x 6
Patch Week Value Attrition id forecast
<chr> <date> <dbl> <dbl> <int> <dbl>
1 11P11 2021-06-14 2 0.075 1 NA
2 11P11 2021-06-21 0 0.075 2 2.00
3 11P11 2021-06-28 0 0.075 3 0
4 …Run Code Online (Sandbox Code Playgroud) 我希望有一种快速的方法来处理行式计算,其中单元格的值取决于不同列的前几行中的值,更喜欢矢量化而不是循环遍历各个行(从这里开始)。
假设我有以下数据集dt和一个constant(加载的库是data.table,dplyr和purrr)
dt <- structure(list(var1 = c(-92186.7470607738, -19163.5035325072,
-18178.8396858014, -9844.67882723287, -16494.7802822178, -17088.0576319257
), var2 = c(-3.12, NA, NA, NA, NA, NA), var3 = c(1, NA, NA, NA,
NA, NA)), class = c("data.table", "data.frame"), row.names = c(NA,
-6L))
constant <- 608383
print(dt)
var1 var2 var3
1: -92186.747 -3.12 1
2: -19163.504 NA NA
3: -18178.840 NA NA
4: -9844.679 NA NA
5: -16494.780 NA NA
6: -17088.058 NA NA …Run Code Online (Sandbox Code Playgroud) 假设我有一个数据框:性别可以将 F 作为女性或 M 作为男性种族可以将 A 作为亚洲人,W 作为白人,B 作为黑人,H 作为西班牙裔
| id | Gender | Race |
| --- | ----- | ---- |
| 1 | F | W |
| 2 | F | B |
| 3 | M | A |
| 4 | F | B |
| 5 | M | W |
| 6 | M | B |
| 7 | F | H |
Run Code Online (Sandbox Code Playgroud)
我想有一组基于性别和种族的列作为虚拟对象,数据框应该像
| id | Gender | Race …Run Code Online (Sandbox Code Playgroud) 我有这个 df:
df <- structure(list(a = 1:5, b = 6:10, c = 11:15, d = c("a", "b",
"c", "d", "e"), e = 1:5), row.names = c(NA, -5L), class = c("tbl_df",
"tbl", "data.frame"))
a b c d e
<int> <int> <int> <chr> <int>
1 1 6 11 a 1
2 2 7 12 b 2
3 3 8 13 c 3
4 4 9 14 d 4
5 5 10 15 e 5
Run Code Online (Sandbox Code Playgroud)
rownames_to_column 作品:
df %>%
column_to_rownames(var="d") %>%
rownames_to_column(var= "d") …Run Code Online (Sandbox Code Playgroud) 我阅读了使用手册accumulate,说它是一个 2 参数函数。我不明白给定的例子:
1:5 %>% accumulate(`+`)
#> [1] 1 3 6 10 15
Run Code Online (Sandbox Code Playgroud)
如果accumulate是一个 2 参数函数,它输出的第一个元素应该是3?因为1+2=3,为什么第一个元素可以作为输出?
我希望在同一个数据集中运行几十个交叉表,并使用一组结果变量。我有一个函数可以提供我想要的交叉表:
second_table = function(dat, variable1, variable2){
dat %>%
tabyl({{variable1}}, {{variable2}}, show_na = FALSE) %>%
adorn_percentages("row") %>%
adorn_pct_formatting(digits = 1) %>%
adorn_ns()
}
Run Code Online (Sandbox Code Playgroud)
以 mtcars 数据集为例,该函数为我提供了我想要的单个变量:
cars = datasets::mtcars
second_table(cars, cyl, vs)
Run Code Online (Sandbox Code Playgroud)
不过,我真正想要的是创建很多这样的表,其中 dat = cars 和 variable2 = vs 参数保持不变,但使用几个不同的列作为 variable1 参数。出于本示例的目的,假设它是以下 4 个变量:
variables = c("cyl", "am", "gear", "carb")
Run Code Online (Sandbox Code Playgroud)
我不确定 purrr 包中的 map 函数是否是执行此操作的最佳方法,但是我一直没有成功尝试使用 map 和 map_at 等相关函数进行各种不同的操作。如果有办法用 purrr 做到这一点,那么这就是我更愿意做的,但我愿意接受任何建议。我真的不在乎输出是什么样子,只是我可以得到我需要的所有交叉表,而无需多次复制和粘贴代码。
任何帮助是极大的赞赏!
这个问题虽然有三个答案,但在我思考这个问题时却引起了我的怀疑。虽然我知道问题可以通过其他方法解决(特别是使用 purrr 或应用函数组),但我不确定它实际上可以通过吗mutate(across(...?为了清楚起见,我在这里重现这个问题。注意:我不是在寻找它的答案,而是只是对我的疑问的答案是否两组变量实际上可以通过 mutate/across 传递
有两组变量(一组没有后缀,一组有后缀avail)。
df <- tibble(a = c(0, 1, 0, 0, 0),
a_avail = c(1, 1, 1, 0, 0),
b = c(1, 1, 1, 0, 0),
b_avail = c(1, 0, 0, 1, 0))
# A tibble: 5 x 4
a a_avail b b_avail
<dbl> <dbl> <dbl> <dbl>
1 0 1 1 1
2 1 1 1 0
3 0 1 1 0
4 0 0 0 1
5 0 0 0 0 …Run Code Online (Sandbox Code Playgroud) 虽然我试图搜索它是否重复,但我找不到类似的问题。(虽然有类似的,但和我的要求有些不同)
我的问题是,我们是否可以使用字符串操作函数,substr例如. 作为一个可重现的例子,考虑这个stringr::str_remove.namesdplyr::across
library(dplyr)
iris %>%
summarise(across(starts_with('Sepal'), mean, .names = '{.col}_mean'))
Sepal.Length_mean Sepal.Width_mean
1 5.843333 3.057333
Run Code Online (Sandbox Code Playgroud)
现在我的问题是我想重命名输出列,str_remove(.col, 'Sepal')以便我的输出列名称只是Length.mean和Width.mean。我为什么问这个问题,因为这个论点的描述表明
.names
描述如何命名输出列的粘合规范。这可以使用 {.col} 代表选定的列名称,并使用 {.fn} 代表正在应用的函数的名称。默认值 (NULL) 相当于单函数情况下的“{.col}”,以及列表用于 .fns 的情况下的“{.col}_{.fn}”。
我尝试了很多可能性,包括以下内容,但这些都不起作用
library(tidyverse)
library(glue)
iris %>%
summarise(across(starts_with('Sepal'), mean,
.names = glue('{xx}_mean', xx = str_remove(.col, 'Sepal'))))
Error: Problem with `summarise()` input `..1`.
x argument `str` should be a character vector (or an object coercible to)
i Input `..1` is …Run Code Online (Sandbox Code Playgroud) 我正在与 R 合作。
在这里,我分享了我的数据样本...
structure(list(column_a = c("1_1", "1_1", "1_2", "1_2", "1_2",
"2_1", "2_2", "2_2", "3_1", "3_2"), column_b = c("kitchen", "tree",
"hate", "kind", "table", "dog", "human", "car", "moon", "rage"
)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
))
column_a column_b
1 1_1 kitchen
2 1_1 tree
3 1_2 hate
4 1_2 kind
5 1_2 table
6 2_1 dog
7 2_2 human
8 2_2 car
9 3_1 moon
10 3_2 rage
Run Code Online (Sandbox Code Playgroud)
我需要计算条件(1_1、1_2 等)产生的总单词的平均值。我唯一的问题是以“_1”结尾的条件总数为 50,以“_2”结尾的条件总数为 100。
因此,由于条件“1_1”产生了两个词(在样本中),我应该通过除以 50 来计算平均值。这是 2/50 = …
印度风格的千位分隔符就是这样使用的。第一个分隔符为 3 位数字(千),之后每两位数字分隔符。
1
10
100
1,000
10,000
1,00,000
10,00,000
1,00,00,000
10,00,00,000
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过使用更改/格式化 ggplot2 图表中的轴 scale_y_continuous(labels = scales::comma)
但是,如何根据上述印度格式更改 r ggplot2 图表轴中的千位分隔符占位符。
示例
1
10
100
1,000
10,000
1,00,000
10,00,000
1,00,00,000
10,00,00,000
Run Code Online (Sandbox Code Playgroud)
