在bind_rows多个df(如下所示)之后,我遇到了一个问题
df <- data.frame(sites = c("a", "b", "c", "a", "b", "c", "a", "b","c", "a", "b","c"),
name = c("x1", "x1", "x1", "x2", "x2", "x2", "x3", "x3", "x3", "x4", "x4", "x4"),
compound1 = c("10", "10", "10", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA" ),
compound2 = c("NA", "NA", "NA", "15", "15","15", "NA", "NA", "NA", "NA", "NA", "NA"),
compound3 = c("NA", "NA", "NA", "NA", "NA", "NA", "20", "25", "30", "NA", "NA", "NA"),
compound4 = c("NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "40", "22", "23"))
基本上我希望有以下输出
df2 <- data.frame(sites c("a", "b", "c", "a", "b", "c", "a", "b","c", "a", "b","c"),
name = c("x1", "x1", "x1", "x2", "x2", "x2", "x3", "x3", "x3", "x4", "x4", "x4"),
conc = c("10", "10", "10", "15", "15","15","20", "25", "30", "40", "22", "23"))
也就是说,只有三列(站点,名称和新列conc)以及“ conc”列下的所有值
我对如何操作感到迷茫,感谢您的反馈。如果您的帮助使用tidyverse,那就更好了。
谢谢!
这是一种方法。我们可以先替换"NA"
为NA
,然后再使用coalesce
。
library(dplyr)
df_out <- df %>%
mutate(across(starts_with("compound"), .fns = function(x){
x2 <- ifelse(x %in% "NA", NA_character_, x)
return(x2)
}))
df_comp <- df_out %>%
select(starts_with("compound")) %>%
as.list.data.frame()
df_out <- df_out %>%
mutate(conc = coalesce(!!!df_comp)) %>%
select(-starts_with("compound"))
df_out
# sites name conc
# 1 a x1 10
# 2 b x1 10
# 3 c x1 10
# 4 a x2 15
# 5 b x2 15
# 6 c x2 15
# 7 a x3 20
# 8 b x3 25
# 9 c x3 30
# 10 a x4 40
# 11 b x4 22
# 12 c x4 23
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句