3

如何根据某个行值重命名分组 dplyr tibble 中的列?下图显示了我的 tibble 之前的外观以及操作后的外观。

在此处输入图像描述

我尝试了以下代码,但没有设法编写能够从“名称”列灵活声明新列名称的列重命名函数。

library(dplyr)

df <- data.frame(
 "splitvar"=c(1,1,1,2,2,3,3,3,3),
 "value"=c(1,4,2,5,6,9,11,13,12),
 "name"=c("Harold","Harold","Harold","Jane","Jane","George","George","George","George"),
 stringsAsFactors=F
)

grouped_tbl <- df %>%
  group_by( splitvar ) %>%
  eval(parse(
    paste0("rename(",unique(name)," = value)")
  ))

相关:替换 dplyr 中的“重命名”

4

2 回答 2

3

像这样:

library(tidyverse)

df %>% 
  split(.$splitvar) %>% 
  map(~rename(., !!unique(.$name) := "value"))

我花了一些时间来理解 quosure-thing,但尝试看看使用 dplyr 进行编程

代码的输出是:

$`1`
  splitvar Harold   name
1        1      1 Harold
2        1      4 Harold
3        1      2 Harold

$`2`
  splitvar Jane name
4        2    5 Jane
5        2    6 Jane

$`3`
  splitvar George   name
6        3      9 George
7        3     11 George
8        3     13 George
9        3     12 George
于 2017-12-15T16:22:10.400 回答
1

您可以分开,制作新列,然后重新绑定在一起。

这是通过nest/ unnest( tidyr ) 和map( purrr )的选项

library(tidyr)
library(purrr)

rename_at用作 tidyeval 的替代品。

df %>%
    group_by(splitvar) %>%
    nest() %>%
    mutate(data = map(data, function(x) rename_at(x, "value", funs( unique(x$name) ) ) ) ) %>%
    unnest()

# A tibble: 9 x 5
  splitvar Harold   name  Jane George
     <dbl>  <dbl>  <chr> <dbl>  <dbl>
1        1      1 Harold    NA     NA
2        1      4 Harold    NA     NA
3        1      2 Harold    NA     NA
4        2     NA   Jane     5     NA
5        2     NA   Jane     6     NA
6        3     NA George    NA      9
7        3     NA George    NA     11
8        3     NA George    NA     13
9        3     NA George    NA     12

这可能是一个“重塑”问题,我通过tidyr 完成。但是,这不会保留该name列。

df %>%
    group_by(splitvar) %>%
    mutate(row = row_number() ) %>%
    spread(name, value)

# A tibble: 9 x 5
# Groups:   splitvar [3]
  splitvar   row George Harold  Jane
*    <dbl> <int>  <dbl>  <dbl> <dbl>
1        1     1     NA      1    NA
2        1     2     NA      4    NA
3        1     3     NA      2    NA
4        2     1     NA     NA     5
5        2     2     NA     NA     6
6        3     1      9     NA    NA
7        3     2     11     NA    NA
8        3     3     13     NA    NA
9        3     4     12     NA    NA
于 2017-12-15T16:31:21.323 回答