我有一个包含两个变量df$soil
和df$use
的 Dataframe df
。我想根据一个条件将两个新变量df$ef1
和df$ef2
添加到我的数据集中。我使用'case_when'来完成此操作:
ef1_grassl_mineral <- 0.2
ef1_grassl_peat <- 0.3
ef1_arable_mineral <- 0.4
ef1_arable_peat <- 0.5
ef2_grassl_mineral <- 2.3
ef2_grassl_peat <- 3.4
ef2_arable_mineral <- 4.5
ef2_arable_peat <- 5.6
df <- data.frame(soil = c('mineral', 'peat', 'mineral', 'peat'),
use = c('grassl', 'arable', 'arable', 'grassl'))
df <- df %>% mutate (
ef1 = case_when((soil=='mineral' & use=='grassl') ~ ef1_grassl_mineral,
(soil=='peat' & use=='grassl') ~ ef1_grassl_peat,
(soil=='mineral' & use=='arable') ~ ef1_arable_mineral,
(soil=='peat' & use=='arable') ~ ef1_arable_peat),
ef2 = case_when((soil=='mineral' & use=='grassl') ~ ef2_grassl_mineral,
(soil=='peat' & use=='grassl') ~ ef2_grassl_peat,
(soil=='mineral' & use=='arable') ~ ef2_arable_mineral,
(soil=='peat' & use=='arable') ~ ef2_arable_peat))
上面的方法很好用,但是我必须为每个变量重复条件,这使得代码很长。因此,我想知道是否有一种方法可以只指定一次条件(例如,soil=='mineral' & use=='arable')
,然后定义df$ef1
AND df$ef2
。(语法:如果(土壤==“矿物”且使用==“耕地”),则ef1= ef1_阿拉伯_矿物且ef2= ef2_阿拉伯_矿物)
3条答案
按热度按时间edqdpe6u1#
请改用查找表和连接
然后,如果您有一个更大的 Dataframe ,需要在现有
soil
和use
列的基础上添加ef1
和ef2
列,则执行bigger_data %>% left_join(lookup, by = c("soil", "use"))
。我最喜欢这种查找表的特点是它们非常容易审计/调试。如果其他人需要检查值,您可以将查找表存储为平面文件(CSV或类似文件),即使对非技术人员也非常清楚。
khbbv19g2#
可以使用
list()
存储多列的值,然后传递给tidyr::unnest_wider()
。68bkxrlz3#
这可能不是最好的解决方案,但另一个有趣的方法是将所有
ef1
和ef2
查找值放在一个列表中,然后通过连接列来调用它们: