R 向其值基于列-行计算的数据中添加变量
我当前的项目包含的数据结构如下:R 向其值基于列-行计算的数据中添加变量,r,R,我当前的项目包含的数据结构如下: my_df <- tibble( zn = c("hm","hm", "hm", "h60","h60","h60", "h85","h85","h85"), nm = c("c", "cA", "cB", "c","cA", "cB", "c","cA", "cB"), val = c(60, 40, 20, 250, 150, 100, 400, 250, 150), znt = c(100, 100, 100, 300, 300,
my_df <- tibble(
zn = c("hm","hm", "hm", "h60","h60","h60", "h85","h85","h85"),
nm = c("c", "cA", "cB", "c","cA", "cB", "c","cA", "cB"),
val = c(60, 40, 20, 250, 150, 100, 400, 250, 150),
znt = c(100, 100, 100, 300, 300, 300, 500, 500, 500),
)
my_df
# A tibble: 9 x 4
zn nm val znt
<chr> <chr> <dbl> <dbl>
1 hm c 60 100
2 hm cA 40 100
3 hm cB 20 100
4 h60 c 250 300
5 h60 cA 150 300
6 h60 cB 100 300
7 h85 c 400 500
8 h85 cA 250 500
9 h85 cB 150 500
我有一个如何做的想法,但它似乎非常复杂,我希望有一个更好的方法。如果这可以通过使用tidyverse
中的一些东西来实现,那也太棒了
my_df %>%
bind_rows(my_df %>% filter(nm == "c") %>%
mutate(nm = "c0" , val = znt - val)) %>%
arrange(zn, nm)
给予
zn nm val znt
<chr> <chr> <dbl> <dbl>
1 h60 c 250 300
2 h60 c0 50 300
3 h60 cA 150 300
4 h60 cB 100 300
5 h85 c 400 500
6 h85 c0 100 500
7 h85 cA 250 500
8 h85 cB 150 500
9 hm c 60 100
10 hm c0 40 100
11 hm cA 40 100
12 hm cB 20 100
znnm-val-znt
1 h60 c 250 300
2 h60 c0 50 300
3 h60 cA 150 300
4 h60 cB 100 300
5 h85 c 400 500
6 h85 c0 100 500
7 h85 cA 250 500
8 h85 cB 150 500
9 HMC 60 100
10HMC040100
11HMCA 40100
12 hm cB 20 100
另一个选项:
library(tidyverse)
my_df %>%
group_split(zn) %>%
map_dfr(~ add_row(.data = .,
zn = .$zn[1],
nm = 'c0',
val = .$znt[1] - .$val[.$nm == 'c'],
znt = .$znt[1],
.before = 1))
输出:
# A tibble: 12 x 4
zn nm val znt
* <chr> <chr> <dbl> <dbl>
1 h60 c0 50 300
2 h60 c 250 300
3 h60 cA 150 300
4 h60 cB 100 300
5 h85 c0 100 500
6 h85 c 400 500
7 h85 cA 250 500
8 h85 cB 150 500
9 hm c0 40 100
10 hm c 60 100
11 hm cA 40 100
12 hm cB 20 100
#一个tible:12 x 4
zn-nm-val-znt
*
1 h60 c0 50 300
2 h60 c 250 300
3 h60 cA 150 300
4 h60 cB 100 300
5 h85 c0 100 500
6 h85 c 400 500
7 h85 cA 250 500
8 h85 cB 150 500
9HMC040100
10HMC60100
11HMCA 40100
12 hm cB 20 100
另一种选择是先做多、计算,然后做多
my_df %>%
pivot_wider(names_from = "nm", values_from = "val") %>%
mutate(c0 = znt - c) %>%
pivot_longer(cols = -c(zn, znt), names_to = "nm", values_to = "val")
#> # A tibble: 12 x 4
#> zn znt nm val
#> <chr> <dbl> <chr> <dbl>
#> 1 hm 100 c 60
#> 2 hm 100 cA 40
#> 3 hm 100 cB 20
#> 4 hm 100 c0 40
#> 5 h60 300 c 250
#> 6 h60 300 cA 150
#> 7 h60 300 cB 100
#> 8 h60 300 c0 50
#> 9 h85 500 c 400
#> 10 h85 500 cA 250
#> 11 h85 500 cB 150
#> 12 h85 500 c0 100
my_df%>%
枢轴(名称取自“nm”,值取自“val”)%>%
突变(c0=znt-c)%>%
枢轴长度(cols=-c(zn,znt),名称到=“nm”,值到=“val”)
#>#tibble:12 x 4
#>zn-znt纳米val
#>
#>1公顷100立方厘米60
#>2 hm 100 cA 40
#>3 hm 100 cB 20
#>4HM100C040
#>5H60300C250
#>6 h60 300 cA 150
#>7 h60 300 cB 100
#>8 h60 300 c0 50
#>9 h85 500 c 400
#>10 h85 500 cA 250
#>11 h85 500 cB 150
#>12 h85 500 c0 100
my_df %>%
pivot_wider(names_from = "nm", values_from = "val") %>%
mutate(c0 = znt - c) %>%
pivot_longer(cols = -c(zn, znt), names_to = "nm", values_to = "val")
#> # A tibble: 12 x 4
#> zn znt nm val
#> <chr> <dbl> <chr> <dbl>
#> 1 hm 100 c 60
#> 2 hm 100 cA 40
#> 3 hm 100 cB 20
#> 4 hm 100 c0 40
#> 5 h60 300 c 250
#> 6 h60 300 cA 150
#> 7 h60 300 cB 100
#> 8 h60 300 c0 50
#> 9 h85 500 c 400
#> 10 h85 500 cA 250
#> 11 h85 500 cB 150
#> 12 h85 500 c0 100