我有一个看起来像这样的数据框
> 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)
没有任何辅助功能
你可以试试这个:
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)
看起来这个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)
| 归档时间: |
|
| 查看次数: |
26036 次 |
| 最近记录: |