使用dplyr按组连接字符串

crf*_*crf 30 r dplyr

我有一个看起来像这样的数据框

> data <- data.frame(foo=c(1, 1, 2, 3, 3, 3), bar=c('a', 'b', 'a', 'b', 'c', 'd'))
> data
  foo bar
1   1   a
2   1   b
3   2   a
4   3   b
5   3   c
6   3   d
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列bars_by_foo,它是bar by foo的值的串联.所以新数据应如下所示:

  foo bar bars_by_foo
1   1   a          ab
2   1   b          ab
3   2   a           a
4   3   b         bcd
5   3   c         bcd
6   3   d         bcd
Run Code Online (Sandbox Code Playgroud)

我希望以下内容有效:

p <- function(v) {
  Reduce(f=paste, x = v)
}
data %>% 
  group_by(foo) %>% 
  mutate(bars_by_foo=p(bar))
Run Code Online (Sandbox Code Playgroud)

但是那段代码给了我一个错误

Error: incompatible types, expecting a character vector.

我究竟做错了什么?

Dav*_*urg 70

你可以干脆做

data %>% 
     group_by(foo) %>% 
     mutate(bars_by_foo = paste0(bar, collapse = "")) 
Run Code Online (Sandbox Code Playgroud)

没有任何辅助功能

  • @Dutschke不确定,也许`data %&gt;% group_by(foo) %&gt;% summarise(sum_foo = sum(foo), Bars_by_foo = Past0(bar, Collapse = ""))`? (3认同)
  • 哦崩溃=""是不同的!没有它它不起作用,这就是我编写辅助函数的原因. (2认同)
  • 另请注意,崩溃可以是任何东西,只是不能为 NULL。如果需要,您可以使用 collapse = " " 或 collapse = ","。 (2认同)
  • 在我的用例中,这返回了所有行,但只想保留一个,只需在撤消 `group_by` 之前放入 `slice(1)` (2认同)

989*_*989 6

你可以试试这个:

agg <- aggregate(bar~foo, data = data, paste0, collapse="")
df <- merge(data, agg, by = "foo", all = T)
colnames(df) <- c(colnames(data), "bars_by_foo") # optional


  # foo bar bars_by_foo
# 1   1     a    ab
# 2   1     b    ab
# 3   2     a     a
# 4   3     b   bcd
# 5   3     c   bcd
# 6   3     d   bcd
Run Code Online (Sandbox Code Playgroud)


plu*_*uet 6

看起来这个mutate函数有点问题——我发现summarise当你在 dplyr 中对数据进行分组时,这是一种更好的方法(虽然这不是一个硬性规定)。

paste函数还会在结果中引入空格,因此设置sep = 0或使用只需使用paste0.

这是我的代码:

p <- function(v) {
  Reduce(f=paste0, x = v)
}

data %>% 
    group_by(foo) %>% 
    summarise(bars_by_foo = p(as.character(bar))) %>%
    merge(., data, by = 'foo') %>%
    select(foo, bar, bars_by_foo)
Run Code Online (Sandbox Code Playgroud)

导致..

  foo bar bars_by_foo
1   1   a          ab
2   1   b          ab
3   2   a           a
4   3   b         bcd
5   3   c         bcd
6   3   d         bcd
Run Code Online (Sandbox Code Playgroud)

  • `paste` 的 `collapse` 参数将是执行 `Reduce(paste())` 的更有效方法。 (2认同)