R 能否基于TIBLE中另一列的值对多个列进行变异,只指定一次条件?
假设我有以下tibble: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
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梨绿色水果