繁体   English   中英

重命名以其他两个因素的唯一组合为条件的因素水平

[英]Renaming levels of factor conditional on unique combinations of two other factors

可以说我有一个像这样的数据框:

df<- 
 plantfam        lepfam                      lepsp
 Asteraceae      Geometridae                 Eois sp         
 Asteraceae      Erebidae                                     
 Poaceae         Erebidae                    
 Poaceae         Noctuidae                         
 Asteraceae      Saturnidae                  Polyphemous sp        
 Melastomaceae   Noctuidae                   
 Asteraceae             
 Melastomaceae   
                 Noctuidae
                 Erebidae

我想提出独特lepsp名称上的唯一组合条件plantfamlepfam 输出将如下所示:

output<- 
 plantfam        lepfam                      lepsp
 Asteraceae      Geometridae                 Eois sp         
 Asteraceae      Erebidae                    Erebidae_morphosp1                 
 Poaceae         Erebidae                    Erebidae_morphosp2
 Poaceae         Noctuidae                   Noctuidae_morphosp1      
 Asteraceae      Saturnidae                  Polyphemous sp        
 Melastomaceae   Noctuidae                   Noctuidae_morphosp2
 Asteraceae             
 Melastomaceae   
                 Noctuidae
                 Erebidae

注意:每个lepfam必须首先被子集化。 对于该lepfam子集中的每个唯一的plantfam lepfam组合, lepfam指定一个形态物种名称;对于那些plantfamlepfam为空白的植物,则不会指定形态物种。

我引用了以下内容: https ://stackoverflow.com/a/44479195/8061255 R:对于循环-对于每个子集,添加包含子集因子水平和唯一iD编号的字符值

我尝试以下代码未成功:

file<-file %>%
group_by(lepfam) %>% 
mutate(lepsp=ifelse(lepsp!=""| plantfam=="" & lepfam=="", lepsp, 
                  paste0(lepfam, "_morphosp", match(lepfam, unique 
  (lepfam)))))

当我想回答时,您已经自己完成了。 无论如何,我都会这样做,因为我不确定您的解决方案是否正确(或者我可能误解了这个问题)。

因此,您的两个解决方案都产生输出,与示例给出的输出不同。

df <- read.table(sep = ",", header = TRUE, stringsAsFactors = FALSE, text = "
plantfam,lepfam,lepsp\n
Asteraceae,Geometridae,Eois sp\n
Asteraceae,Erebidae,\n
Poaceae,Erebidae,\n
Poaceae,Noctuidae,\n
Asteraceae,Saturnidae,Polyphemous sp\n
Melastomaceae,Noctuidae,\n
Asteraceae,,\n
Melastomaceae,,\n
,Noctuidae,\n
,Erebidae,\n
")

df %>% group_by(lepfam) %>% mutate(lepsp=ifelse(lepsp!="" | plantfam=="" & lepfam=="", lepsp, paste0(lepfam, "_morphosp", match(lepfam, unique(lepfam)))))
Source: local data frame [10 x 3]
Groups: lepfam [5]

# A tibble: 10 x 3
        plantfam      lepfam               lepsp
           <chr>       <chr>               <chr>
 1    Asteraceae Geometridae             Eois sp
 2    Asteraceae    Erebidae  Erebidae_morphosp1
 3       Poaceae    Erebidae  Erebidae_morphosp1
 4       Poaceae   Noctuidae Noctuidae_morphosp1
 5    Asteraceae  Saturnidae      Polyphemous sp
 6 Melastomaceae   Noctuidae Noctuidae_morphosp1
 7    Asteraceae                      _morphosp1
 8 Melastomaceae                      _morphosp1
 9                 Noctuidae Noctuidae_morphosp1
10                 Erebidae   Erebidae_morphosp1

df %>% group_by(lepfam) %>% mutate(lepsp=ifelse(lepsp!="" | plantfam=="" | lepfam=="", lepsp, paste0(lepfam, "_morphosp", match(lepfam, unique (lepfam)))))
Source: local data frame [10 x 3]
Groups: lepfam [5]

# A tibble: 10 x 3
        plantfam      lepfam               lepsp
           <chr>       <chr>               <chr>
 1    Asteraceae Geometridae             Eois sp
 2    Asteraceae    Erebidae  Erebidae_morphosp1
 3       Poaceae    Erebidae  Erebidae_morphosp1
 4       Poaceae   Noctuidae Noctuidae_morphosp1
 5    Asteraceae  Saturnidae      Polyphemous sp
 6 Melastomaceae   Noctuidae Noctuidae_morphosp1
 7    Asteraceae                                
 8 Melastomaceae                                
 9                 Noctuidae                    
10                  Erebidae                    

第一个解决方案显然是错误的。 第二个名称似乎也不对,因为名称不是唯一的: Erebidae_morphosp1Erebidae_morphosp1被两次包含。

那就是我的解决方案。 它非常丑陋,而且远非优雅,但是输出与示例中的输出匹配。

condition <- quote(lepsp == "" & plantfam != "" & lepfam != "")
subset1 <- df %>% filter(condition) %>% group_by(lepfam) %>% mutate(lepsp = paste0(lepfam,"_morphosp",row_number()))
subset2 <- df %>% filter(condition) %>% setdiff(df, .)
union(subset1, subset2) %>% arrange(lepsp)
Source: local data frame [10 x 3]
Groups: lepfam [5]

# A tibble: 10 x 3
        plantfam      lepfam               lepsp
           <chr>       <chr>               <chr>
 1                  Erebidae                    
 2    Asteraceae                                
 3 Melastomaceae                                
 4                 Noctuidae                    
 5    Asteraceae Geometridae             Eois sp
 6    Asteraceae    Erebidae  Erebidae_morphosp1
 7       Poaceae    Erebidae  Erebidae_morphosp2
 8       Poaceae   Noctuidae Noctuidae_morphosp1
 9 Melastomaceae   Noctuidae Noctuidae_morphosp2
10    Asteraceae  Saturnidae      Polyphemous sp

稍后我将以崭新的思路考虑它,并可能添加一些更优雅,更简短的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM