合并函数返回错误:'unite_'没有适用于类"c('double', 'numeric')"的对象的方法。

5

我有一个数据集长这样:

p = c(3, 4, 5, 6, 7)
q = c("fr", "", "fr", "fe", "fre")
b = c(1, "", 1, "", 1)
a = c("r", "f", "b", "m", "p")

df=data.frame(p, q, b, a)

我想将 q、b 和 a 合并,并将结果放在一个新列中,因此我使用 unite 函数:

new_df <- df %>% 
  mutate(Merged = unite(q,b,a), sep = "_")

我遇到了这个错误:

Error in UseMethod("unite_") :
no applicable method for 'unite_' applied to an object of class "c('double', 'numeric')"

另外,与上面的问题无关,我想在代码中指定一系列列,以便不必手动输入它们(我想合并几十列)。 我可以写q:a来表示从列q到a吗? 我已经尝试过使用paste函数和这种语法,但它没有起作用。

请注意,我已尝试添加“as.character”。错误是相同的。 - johnjohn
这是如何指定要合并的列范围的方法:df %>% unite(Merged, q:a, sep = "_") - sm925
@sm925 非常感谢,它起作用了。 - johnjohn
1个回答

8
我们在外使用。 意思是在修改之前先合并数据。
library(dplyr)
library(tidyr)

df %>% 
     unite(Merged, q, b, a, sep= "_")

unite的用法如下:

unite(data, col, ..., sep = "_", remove = TRUE, na.rm = FALSE)

其中

col - 新列的名称,可以是字符串或符号。


或者另一种选择是使用 transmutestr_c

library(stringr)

df %>%
    transmute(p, Merged = str_c(q, b, a, sep="_"))

风格问题:为什么unitemutate之外?OP使用的方式似乎更自然。 - its.me.adam
@its.me.adam,有一些函数会在变异之外执行某些操作,例如add_countcountseparateextractunite,这些函数需要一个输入数据框/斯蒂布尔/数据表对象而不是向量,而mutate/summarise是常见的转换/汇总函数,我们可以使用min/max/sum/...等函数。unitepaste的一种特殊形式。虽然我们可以在mutate中使用pastestr_c来复制一些行为,但当一行中有NA元素时,unite非常方便,我们可以使用na.rm = TRUE来删除那些NAs再进行连接。 - akrun
谢谢,我明白了。我想问的是为什么以这种方式构思unite。无论如何,我不知道str_c,所以我尝试了一下。它在连接之前也会删除NAs。因此,对于OP来说,在mutate内使用Merged = str_c(q,b,a)是否最好? - its.me.adam
1
@its.me.adam,它可以在mutate内部完成,也可以使用with(df, str_c(q, b, a))在外部完成。这是来自stringr的函数。我不知道为什么他们要创建一个具有特定属性集的函数。也许,他们认为unite比已经存在的函数更合适理解。我不知道正确的原因。 - akrun
啊,明白了 - 谢谢 akrun!我承认如果我可以使用 str_cmutate 一起使用,我就看不出 unite 的意义了。 - its.me.adam
1
@its.me.adam,你说得对,相比于str_c或paste(如果进行基准测试),unite可能不是那么高效。但这些方便的函数可以以一种方式使用,使人们不必为每个步骤编写文档,因为它是自证明的。 - akrun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接