我有一个像这样的数据框
df=data.frame(a=rep(c("x","y"),2),b=c("Rome", "Venice", "Barcelona", "Paris"))
我希望按列a嵌套b,使其显示
x Rome, Barcelona
y Venice, Paris
然而,这似乎并没有成功。有什么建议吗?
如建议
df$b=as.character(df$b)
df=as.data.frame(df %>% group_by(a) %>% nest(b))
然而,df的新数据列似乎是tbl_df格式,结果是这样的
a data
x list(b = c("Rome", "Barcelona")
有没有办法让新的嵌套列只是正常的字符串组合?
答案 0 :(得分:6)
如果您没有使用tidyr
/ nest
解决方案,只需dplyr
即可使用以下方法执行此操作:
df %>%
group_by(a) %>%
summarise(b = paste(b, collapse = ", "))
返回:
a b
<fctr> <chr>
1 x Rome, Barcelona
2 y Venice, Paris
如果您想使用nest
,可以使用map_chr
中的purrr
来执行您想要的操作:
df %>%
mutate(b = as.character(b)) %>%
nest(b) %>%
mutate(cityList = map_chr(data, ~paste(.$b, collapse = ", "))) %>%
select(-data)
请注意,正如@ joel.wilson指出的那样,为此,您可能需要将城市名称显式转换为字符(如果它们是一个因素)。它返回:
a cityList
<fctr> <chr>
1 x Rome, Barcelona
2 y Venice, Paris
答案 1 :(得分:3)
确保column b
是一个字符:然后执行以下操作,
as.data.frame(df %>% group_by(a) %>% nest(b))
# a data
#1 x Rome, Barcelona
#2 y Venice, Paris
如果column b
是一个因素:那么将输出水平
> class(df$b)
[1] "factor"
> df$b
[1] Rome Venice Barcelona Paris
Levels: Barcelona Paris Rome Venice
> as.data.frame(df %>% group_by(a) %>% nest(b))
# a data
#1 x 3, 1
#2 y 4, 2
根据您的要求进行更改:尝试以下代码:df1是来自as.data.frame()的o / p
df1 = df %>% group_by(a) %>% nest(b)
df1$newcol = sapply(df1$data, function(x) paste(x$b, collapse = ","))
df1
a data newcol
# (fctr) (chr) (chr)
#1 x <tbl_df [2,1]> Rome,Barcelona
#2 y <tbl_df [2,1]> Venice,Paris