Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 向其值基于列-行计算的数据中添加变量_R - Fatal编程技术网

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