[英]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
名称上的唯一组合条件plantfam
和lepfam
。 输出将如下所示:
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
指定一个形态物种名称;对于那些plantfam
或lepfam
为空白的植物,则不会指定形态物种。
我引用了以下内容: 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_morphosp1
和Erebidae_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.