我有两个包含地下水数据的图表
df1 <- data.frame('ID' = c('r23', 'r24', 'r25', 'r26'),
'depth' = c("deep","deep","shallow","shallow"),
'conc1' = c("3.0", "<1.0", "2.5", "10.0"),
'conc2' = c(23, 45, 56, 12)
)
df2 <- data.frame('ID' = c('r27', 'r28', 'r29', 'r30'),
'depth2' = c("deep","shallow","shallow","deep"),
'conc1' = c(5.0, 3.4, 5.2, 1.2),
'conc2' = c(56, 76, 45, 23)
)
字符串
我这样定义数值,也是为了捕获具有检测限的数值变量
num_vars_p <- names(df1 %>% select_if(function(x) is.numeric(x) | sum(grepl("<[0-9]", x)) > 0))
型
然后我像这样融合它们:
pm <- full_join(df1 %>% mutate(across(everything(), as.character)),
df2 %>% mutate(across(everything(), as.character)),
by = c("ID", "depth" = "depth2", "conc1", "conc2"),
.keep_all = T) %>% mutate(across(all_of(num_vars_p), as.numeric))
型
然后我收到警告信息:
Warning message:
Problem while computing `..1 = across(all_of(num_vars_p), as.numeric)`.
ℹ NAs introduced by coercion
型
我想有一个函数,给我的列名pm
和数量的NA已被引入。
1条答案
按热度按时间ykejflvf1#
让我们解决两个问题:
1.我们没有
r23
和朋友,为了你的代码,我将天真地用paste0("A", 1:4)
替换它们;1.我将从
full_join
中删除.keep_all=TRUE
;这不是*_join
的参数,在最近的dplyr
版本中,在调用的...
部分中有任何意外的东西都是错误的。我怀疑这是从distinct(..)
调用的结转,或者你打算keep=TRUE
(这会产生另一个错误......所以可能不是这个)。字符串
有了这个,因为它是小数据,我们可以简单地做
pm
,在这个例子中,第2行conc1
是NA
。我假设你的数据更大,所以我们需要一个替代方案。假设你不期望
NA
值 * 任何地方 *,那么你可以简单地使用complete.cases
:型
它方便地保留了它的行号(
2
,因为我们在这里没有使用dqr),并显示了错误的列。如果你有太多的列,需要减少到这些列,那么我们可以这样做:
型
(虽然我们失去了行号
dplyr
的agressive de-row-numbering).我假设ID
对你来说很重要,如果其他人也很重要,那么他们很容易添加。如果你只需要知道哪一行或哪一列,
型