Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.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 能否基于TIBLE中另一列的值对多个列进行变异,只指定一次条件?_R_Dplyr_Tidyverse - Fatal编程技术网

R 能否基于TIBLE中另一列的值对多个列进行变异,只指定一次条件?

R 能否基于TIBLE中另一列的值对多个列进行变异,只指定一次条件?,r,dplyr,tidyverse,R,Dplyr,Tidyverse,假设我有以下tibble: library(tidyverse) foods <- tibble( name = c("apple", "carrot", "broccoli", "pear", "carrot", "broccoli"), color = c("red", "orange", "purple", "green", "orange", "purple"), type = c("fruit", "veggie", "fruit", "fruit", "vegg

假设我有以下tibble:

library(tidyverse)
foods <- tibble(
  name  = c("apple", "carrot", "broccoli", "pear", "carrot", "broccoli"),
  color = c("red", "orange", "purple", "green", "orange", "purple"),
  type  = c("fruit", "veggie", "fruit", "fruit", "veggie", "fruit")
)

> foods
# A tibble: 6 x 3
  name     color  type  
  <chr>    <chr>  <chr> 
1 apple    red    fruit 
2 carrot   orange veggie
3 broccoli purple fruit 
4 pear     green  fruit 
5 carrot   orange veggie
6 broccoli purple fruit
库(tidyverse)
食品
#一个tibble:6x3
名称颜色类型
1个苹果红色水果
2胡萝卜橙蔬菜
3西兰花紫色水果
4梨绿色水果
5胡萝卜橙蔬菜
6西兰花紫色水果
正如你所看到的,西兰花的颜色和类型在这里是不正确的。我可以通过分别改变颜色和类型来纠正它,如下所示:

> foods %>% 
+   mutate(color = if_else(name == "broccoli", "green", color),
+          type  = if_else(name == "broccoli", "veggie", type))
# A tibble: 6 x 3
  name     color  type  
  <chr>    <chr>  <chr> 
1 apple    red    fruit 
2 carrot   orange veggie
3 broccoli green  veggie
4 pear     green  fruit 
5 carrot   orange veggie
6 broccoli green  veggie
>食品%>%
+变异(颜色=如果其他(名称==“西兰花”,“绿色”,颜色),
+type=if_else(name==“花椰菜”、“蔬菜”,type))
#一个tibble:6x3
名称颜色类型
1个苹果红色水果
2胡萝卜橙蔬菜
3西兰花绿色蔬菜
4梨绿色水果
5胡萝卜橙蔬菜
6西兰花绿色蔬菜

在本例中,我的解决方案基本上是好的,但是如果您试图同时对多个列进行变异,那么重复if_else条件会变得很烦人。是否有一种方法可以指定一次条件并改变多个列?我已经做了一些挖掘,但以前找不到这个问题-我肯定有人问过,我可能只是没有正确地表达我的搜索。所以请随意给我指出那个方向。我更喜欢dplyr/tidyverse解决方案,因为这是我熟悉的,但其他解决方案也可能有用。谢谢。

如果我们有不同的值要更新,
map2
会更好

library(dplyr)
library(purrr)
map2_dfc(c('color', 'type'), c('green', 'veggie'), 
       ~ {v1 <- .y
          foods %>% 
               transmute_at(vars(.x), ~ replace(., name == 'broccoli', v1))})%>%
    bind_cols(foods %>% 
               select(name), .)
库(dplyr)
图书馆(purrr)
map2_dfc(c(‘颜色’、‘类型’),c(‘绿色’、‘素食’),
{v1%
transmute_at(vars(.x),~replace(,name='brocoli',v1))})%>%
结合剂(食品%>%
选择(名称),)

西兰花在tibble中出现两次很重要吗?还是你只是 想要更新吗?如果后者

updateFoods <- tibble(
  name = c("broccoli", "eggplant"),
  color = c("green", "purple"),
  type = c("veggie","veggie")
)

foods %>% 
  rbind(updateFoods) %>% 
  group_by(name) %>% 
  summarise_all(~ last(.))

# A tibble: 5 x 3
  name     color  type  
  <chr>    <chr>  <chr> 
1 apple    red    fruit 
2 broccoli green  veggie
3 carrot   orange veggie
4 eggplant purple veggie
5 pear     green  fruit 
updateFoods%
rbind(updateFoods)%>%
分组单位(名称)%>%
总结所有(~最后()
#一个tibble:5x3
名称颜色类型
1个苹果红色水果
2西兰花绿色蔬菜
3胡萝卜橙蔬菜
4茄子紫色蔬菜
5梨绿色水果