我正在尝试填充一个包含分类信息的大文件,以便每一行都包含相关数据。目前,文件是结构化的,因此,从亚类到亚种:
家庭 | 属 | 物种 |
---|---|---|
F1 | NA | NA |
NA | G1 | NA |
NA | NA | S1 |
NA | NA | S2 |
NA | G2 | NA |
NA | NA | S1 |
NA | NA | S2 |
这里比如我想在Species有数据的时候把Genus往下填,Family也一样,然后去掉多余的行。最终结果应该是这样的:
家庭 | 属 | 物种 |
---|---|---|
F1 | G1 | S2 |
F1 | G1 | S2 |
F1 | G2 | S1 |
F1 | G2 | S2 |
我在下面包含了示例数据:
df <- data.frame(
family = c("Rheaidae",NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA),
genus = c(NA,"Rhea",NA,NA,NA,NA,NA,NA,NA,NA,NA,NA),
species = c(NA,NA,"americana",NA,NA,NA,NA,NA,"pennata",NA,NA,NA),
subspecies = c(NA,NA,NA,"americana","intermedia","nobilis","araneipes","albescens",NA,"garleppi","tarapacensis","pennata")
)
我已经尝试了几种不同的方法来组合 mutate、ifelse、loops 等,但我没有取得任何进展。我在下面提供了一个示例,它没有用,但这是我迄今为止最成功的尝试。
df %>%
mutate(g = ifelse(is.na(subspecies), "NA",
zoo::na.locf(species, na.rm = F)))
家庭 | 属 | 物种 | 亚种 | 克 |
---|---|---|---|---|
鲇科 | NA | NA | NA | NA |
NA | 土卫六 | NA | NA | NA |
NA | NA | 美国 | NA | NA |
NA | NA | NA | 美国 | 美国 |
NA | NA | NA | 媒体 | 美国 |
NA | NA | NA | 紫罗兰 | 美国 |
NA | NA | NA | 蜘蛛 | 美国 |
NA | NA | NA | 白炽灯 | 美国 |
NA | NA | pennata | NA | NA |
NA | NA | NA | garleppi | pennata |
NA | NA | NA | 蒲公英 | pennata |
NA | NA | NA | pennata | pennata |
编辑 @benson23 建议使用
df %>% fill(everything(), .direction = "downup") %>% distinct_all()
我以前遇到过类似的事情,但尽管它在填充单元格方面做得很好,但它给我留下了错误的行。我在下面给出了一个例子:
家庭 | 普通 | 属 | 物种 | 亚种 |
---|---|---|---|---|
鹤科 | NA | NA | NA | NA |
NA | 鸵鸟 | NA | NA | NA |
NA | NA | 鸟 | NA | NA |
NA | NA | NA | 骆驼 | NA |
NA | NA | NA | NA | 澳大利亚人 |
NA | NA | NA | 钼磷 | NA |
鲇科 | NA | NA | NA | NA |
NA | 美洲狮 | NA | NA | NA |
NA | NA | 土卫六 | NA | NA |
NA | NA | NA | 美国 | NA |
NA | NA | NA | NA | 美国 |
NA | NA | NA | NA | 媒体 |
变成:
家庭 | 普通 | 属 | 物种 | 亚种 |
---|---|---|---|---|
鹤科 | 鸵鸟 | 鸟 | 骆驼 | 澳大利亚人 |
鹤科 | 鸵鸟 | 鸟 | 骆驼 | 澳大利亚人 |
鹤科 | 鸵鸟 | 鸟 | 骆驼 | 澳大利亚人 |
鹤科 | 鸵鸟 | 鸟 | 骆驼 | 澳大利亚人 |
鹤科 | 鸵鸟 | 鸟 | 骆驼 | 澳大利亚人 |
鹤科 | 鸵鸟 | 鸟 | 钼磷 | 澳大利亚人 |
鲇科 | 鸵鸟 | 鸟 | 钼磷 | 澳大利亚人 |
鲇科 | 美洲狮 | 鸟 | 钼磷 | 澳大利亚人 |
鲇科 | 美洲狮 | 土卫六 | 钼磷 | 澳大利亚人 |
鲇科 | 美洲狮 | 土卫六 | 美国 | 澳大利亚人 |
鲇科 | 美洲狮 | 土卫六 | 美国 | 美国 |
鲇科 | 美洲狮 | 土卫六 | 美国 | 媒体 |
而不是:
家庭 | 普通 | 属 | 物种 | 亚种 |
---|---|---|---|---|
鹤科 | 鸵鸟 | 鸟 | 骆驼 | 澳大利亚人 |
鹤科 | 鸵鸟 | 鸟 | 钼磷 | NA |
鲇科 | 美洲狮 | 土卫六 | 美国 | 美国 |
鲇科 | 美洲狮 | 土卫六 | 美国 | 媒体 |
简而言之,数据在运行,没有明确的方法来删除错误的行。
df %>%
fill(family)%>%
group_by(family)%>%
fill(everything())%>%
drop_na()
# A tibble: 4 × 5
# Groups: family [2]
family common genus species subspecies
<chr> <chr> <chr> <chr> <chr>
1 Struthionidae Ostriches Struthio camelus australis
2 Struthionidae Ostriches Struthio molybdophanes australis
3 Rheaidae Rheas Rhea americana americana
4 Rheaidae Rheas Rhea americana intermedia