我有一个 Dataframe ,其中一部分看起来像这样:
Domain <- c(rep("Bacteria",3),rep("Archaea", 2))
Phylum <- c("Proteobacteria","Cyanobacteria","Planctomycetota", "Thermoplasmatota", "Thermoplasmatota")
Class <- c("Alphaproteobacteria","Cyanobacteriia","Phycisphaerae","Poseidoniia_A",NA)
Order <- c("Sphingomonadales", NA, "Phycisphaerales", "Poseidoniales", NA)
Family <- c("Emcibacteraceae", NA, NA, "Poseidonia", NA)
Genus <- c("UBA4441", NA,NA,NA,NA)
Species <- c("UBA4441 sp", NA,NA,NA,NA)
demo_table <- data.frame(Domain, Phylum, Class, Order, Family, Genus, Species)
这里的要点是,我想创建一个名为“assignation”的新列,该列包含对最后两列的合并,这两列包含非NA值,并且这些值用空格分隔。
以下是预期输出:
| 领域|门|类别|订单|家庭|属|种属|赋值|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 细菌|变形菌门|α变形菌门|鞘氨醇单胞菌目|分枝杆菌科|乌巴4441|UBA 4441菌株|UBA 4441标准品|
| 细菌|蓝细菌|蓝细菌|不适用|不适用|不适用|不适用|蓝细菌|
| 细菌|浮菌门|斑扇类|石楠目|不适用|不适用|不适用|小球藻目|
| 古细菌|热原体目|波塞冬_A|波塞冬目|波塞冬尼亚|不适用|不适用|波塞冬目|
| 古细菌|热原体目|不适用|不适用|不适用|不适用|不适用|热原体古菌|
我认为paste()
可以在这种情况下工作,但不确定如何实现它,以便我可以得到上述预期的输出 Dataframe 。
3条答案
按热度按时间bis0qfac1#
我们可以在行上使用
base R
-loop,用na.omit
移除NA,用n = 2
和paste
获得最后两个元素tail
对于
tidyverse
,我们也可以使用unite
,并使用na.rm = TRUE
移除NA
,然后提取最后两个字a0x5cqrl2#
如果你想使用
tidyverse
方法,你只需要使用rowwise
+c_across
。我认为把这个操作转换成一个函数也很好,以防你以后需要使用或者甚至改变它的行为。编号
输出
uinbv5nw3#
以下是
dplyr
与tidyr
结合使用的方法: