【问题标题】:how to use nest() in tidyr to collapse several rows如何在 tidyr 中使用 nest() 折叠几行
【发布时间】:2016-12-07 12:07:39
【问题描述】:

我有一个这样的数据框

df=data.frame(a=rep(c("x","y"),2),b=c("Rome", "Venice", "Barcelona", "Paris"))

我想按列嵌套 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")

有没有办法让新的嵌套列只是普通的字符串组合?

【问题讨论】:

  • 这个aggregate(data=df,b~a,toString)怎么样?
  • as.data.frame(df %>% group_by(a) %>% nest(b))

标签: r dplyr tidyr


【解决方案1】:

如果您不喜欢 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,你也可以使用purrr中的map_chr来做你想做的事:

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

【讨论】:

    【解决方案2】:

    确保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 is o/p from as.data.frame()

    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
    

    【讨论】:

    • 有时嵌套列之后变成:list(b = c("Rome", "Barcelona"))。为什么会这样?
    • 我没听懂你..你能分享一个可重复的例子吗?重新编辑问题本身
    • 感谢您的回复。编辑问题。因此,如果运行 df=as.data.frame(df %>% group_by(a) %>% nest(b)) 然后 str(df) 它将数据列显示为 tbl_df 类,如下所示: data 1 x list(b = c ("Rome", "Barcelona")) 2 y list(b = c("Venice", "Paris"))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多