将因子级别重命名为另一个因子的唯一级别

时间:2017-06-10 23:11:00

标签: r

假设我有一个像这样的数据框:

df<- 
   plantfam        plantsp                  plantcn
   Asteraceae                               fuzzy leaf
   Asteraceae                               fuzzy leaf
   Asteraceae      Baccharis latifolia      
   Poaceae                                  3vien
   Asteraceae                               non-fuzzy leaf

我想以一个因素为条件给植物种子名称空白植物:植物食物应该是菊科。从而在plantcn中给出描述符,指定唯一的morpho名称。输出应如下所示:

output<- 
   plantfam        plantsp                  plantcn
   Asteraceae      Asteraceae_morphosp1     fuzzy leaf
   Asteraceae      Asteraceae_morphosp1     fuzzy leaf
   Asteraceae      Baccharis latifolia      
   Poaceae                                  3vien
   Asteraceae     Asteraceae_morphosp2      non-fuzzy leaf

我尝试调整以下代码:https://stackoverflow.com/a/44270608/8061255并尝试以下操作但没有成功:

   file<-file %>%
  mutate(plantsp=ifelse(plantsp!="" | plantfam=="Asteraceae", plantsp, 
                  paste0(plantfam, "_morphosp", match(plantcn, unique 
  (plantcn)))))

1 个答案:

答案 0 :(得分:0)

首先是代码块,然后我会解释我做了什么:

temp <- df %>% 
        filter(is.na(plantsp)) %>% 
        group_by(plantfam, plantcn) %>% 
        summarize(plantsp=NA) %>%
        group_by(plantfam) %>%
        mutate(dummy = cumsum(!is.na(plantcn))) %>%
        mutate(plantsp = paste0(plantfam, " morpho", dummy)) %>%
        select(-dummy)

我建议的第一件事是删除不需要变异filter(is.na(plantsp))的条目。

然后使用group_by(plantfam, plantcn) %>% summarize(plantsp=NA)汇总冗余条目。

我添加了一个dummy变量,该变量在plantcn的每个组中计算mutate(dummy = cumsum(!is.na(plantcn)))

我使用这个虚拟变量来创建你想要的字符串mutate(plantsp = paste0(plantfam, " morpho", dummy))

最后,使用dummy删除select(-dummy)列。

这是结果数据框:

temp
    plantfam        plantcn            plantsp
       <chr>          <chr>              <chr>
1 Asteraceae     fuzzy leaf Asteraceae morpho1
2 Asteraceae non-fuzzy leaf Asteraceae morpho2
3    Poaceae          3vien    Poaceae morpho1

您可以添加已包含plantsp名称的条目:

new.df <- df %>% 
          filter(!is.na(plantsp)) %>%
          full_join( ., temp, by = c("plantfam","plantsp","plantcn"))
new.df

注意:如果你想保留冗余条目,你需要做一些更复杂的事情