Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.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_Filter_Dplyr_Expand - Fatal编程技术网

R按组按筛选值填写新列

R按组按筛选值填写新列,r,filter,dplyr,expand,R,Filter,Dplyr,Expand,我想在我的dat中创建一个新列,由值填充 满足一个条件。因此,我想保留值其中区域==“SA”并将该值填入整个组的新列vals.SA 这结合了过滤器和变异,但我不确定它们的正确组合是什么Filter仅保持行满足条件,但如何将此值扩展到组中的所有行 我的数据: dat <- data.frame(id = c(1,1,2,2,2,2,3,3), regime = c("SA", "B", "SA", "B", "C", "F", "SA", "D"),

我想在我的
dat
中创建一个新列,由值填充 满足一个条件。因此,我想保留
其中
区域==“SA”
并将该值填入整个组的新列
vals.SA

这结合了
过滤器
变异
,但我不确定它们的正确组合是什么
Filter
仅保持行满足条件,但如何将此值扩展到组中的所有行

我的数据:

dat <- data.frame(id = c(1,1,2,2,2,2,3,3),
                  regime = c("SA", "B", "SA", "B", "C", "F", "SA", "D"),
                  value = c(3,5,1,2,5,6,7,8))
填入
val.sa
值对应的预期输出
region==“sa”

id区域值val.sa
1 SA 3 3
2 1 B 5 3
3 2 SA 1 1
42B21
52C51
6 2 F 6 1
7 3南非7 7
83D87

首先创建一个新列
val.sa
,其中
sa
行中的值等于
value
列中的值。然后按
id
fill
向下分组。像这样:

dat %>%
  mutate(val.sa = ifelse(regime == 'SA', value, NA)) %>%
  group_by(id) %>%
  fill(val.sa)
## A tibble: 8 x 4
## Groups:   id [3]
#     id regime value val.sa
#  <dbl> <chr>  <dbl>  <dbl>
#1     1 SA         3      3
#2     1 B          5      3
#3     2 SA         1      1
#4     2 B          2      1
#5     2 C          5      1
#6     2 F          6      1
#7     3 SA         7      7
#8     3 D          8      7
dat%>%
变异(val.sa=ifelse(区域='sa',值,NA))%>%
分组依据(id)%>%
填充(val.sa)
##一个tibble:8x4
##组别:id[3]
#id系统值val.sa
#       
#1 SA 3 3
#2 1 B 5 3
#3 2 SA 1 1
#42B21
#52C51
#6 2 F 6 1
#7 3南非7 7
#83D87

首先创建一个新列
val.sa
,其中
sa
行中的值等于
value
列中的值。然后按
id
fill
向下分组。像这样:

dat %>%
  mutate(val.sa = ifelse(regime == 'SA', value, NA)) %>%
  group_by(id) %>%
  fill(val.sa)
## A tibble: 8 x 4
## Groups:   id [3]
#     id regime value val.sa
#  <dbl> <chr>  <dbl>  <dbl>
#1     1 SA         3      3
#2     1 B          5      3
#3     2 SA         1      1
#4     2 B          2      1
#5     2 C          5      1
#6     2 F          6      1
#7     3 SA         7      7
#8     3 D          8      7
dat%>%
变异(val.sa=ifelse(区域='sa',值,NA))%>%
分组依据(id)%>%
填充(val.sa)
##一个tibble:8x4
##组别:id[3]
#id系统值val.sa
#       
#1 SA 3 3
#2 1 B 5 3
#3 2 SA 1 1
#42B21
#52C51
#6 2 F 6 1
#7 3南非7 7
#83D87
您可以使用:

library(dplyr)
dat %>%
  group_by(id) %>%
  mutate(value.sa = value[regime == 'SA'])
  #OR
  #mutate(value.sa = value[match('SA', regime)])


#     id regime value value.sa
#  <dbl> <chr>  <dbl>    <dbl>
#1     1 SA         3        3
#2     1 B          5        3
#3     2 SA         1        1
#4     2 B          2        1
#5     2 C          5        1
#6     2 F          6        1
#7     3 SA         7        7
#8     3 D          8        7
您可以使用:

library(dplyr)
dat %>%
  group_by(id) %>%
  mutate(value.sa = value[regime == 'SA'])
  #OR
  #mutate(value.sa = value[match('SA', regime)])


#     id regime value value.sa
#  <dbl> <chr>  <dbl>    <dbl>
#1     1 SA         3        3
#2     1 B          5        3
#3     2 SA         1        1
#4     2 B          2        1
#5     2 C          5        1
#6     2 F          6        1
#7     3 SA         7        7
#8     3 D          8        7

如果每个组中只有一个
SA
,则此操作应无任何错误:

dat %>% 
  group_by(id) %>%             
  mutate(val.sa = value[regime == "SA"]) 
#> # A tibble: 8 x 4
#> # Groups:   id [3]
#>      id regime value val.sa
#>   <dbl> <fct>  <dbl>  <dbl>
#> 1     1 SA         3      3
#> 2     1 B          5      3
#> 3     2 SA         1      1
#> 4     2 B          2      1
#> 5     2 C          5      1
#> 6     2 F          6      1
#> 7     3 SA         7      7
#> 8     3 D          8      7

如果每个组中只有一个
SA
,则此操作应无任何错误:

dat %>% 
  group_by(id) %>%             
  mutate(val.sa = value[regime == "SA"]) 
#> # A tibble: 8 x 4
#> # Groups:   id [3]
#>      id regime value val.sa
#>   <dbl> <fct>  <dbl>  <dbl>
#> 1     1 SA         3      3
#> 2     1 B          5      3
#> 3     2 SA         1      1
#> 4     2 B          2      1
#> 5     2 C          5      1
#> 6     2 F          6      1
#> 7     3 SA         7      7
#> 8     3 D          8      7

library(dplyr)
library(tidyr)
 dat %>%
     mutate(val.sa = case_when(regime == 'SA' ~ value) %>%
     group_by(id) %>%
     fill(val.sa)

library(dplyr)
library(tidyr)
 dat %>%
     mutate(val.sa = case_when(regime == 'SA' ~ value) %>%
     group_by(id) %>%
     fill(val.sa)