重命名多列并在R中使用dplyr进行收集

时间:2018-08-05 20:53:52

标签: r dplyr

我正在尝试找到一种使用tidyverse重命名多列的便捷方法。说我有点小话

df <- tibble(a = 1, b = 2, tmp_2000 = 23, tmp_2001 = 22.1, tmp_2002 = 25, pre_2000, pre_2001, pre_2002)

# A tibble: 1 x 8
  a     b tmp_2000 tmp_2001 tmp_2002 pre_2000 pre_2001 pre_2002
<dbl> <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
  1     2       23     22.1       25      100      103      189

temppre代表温度和降水。我想以整洁的形式重组此表,即,一列为temperature,一列为precipitations,每一行都是年份的对应值。

现在,我发现的唯一选择是执行类似的操作

df <- df %>%
  select(-starts_with("pre"))

names(df)[3:5] <- substr(names(df)[3:5],5,8) 

df<-df %>%
  gather(`2000`:`2002`,key = "year",value="temp")  %>%
  mutate("year" = as.integer(year)) 

# A tibble: 3 x 4
  a     b  year  temp
<dbl> <dbl> <int> <dbl>
  1     2  2000  23  
  1     2  2001  22.1
  1     2  2002  25 

这并不妙,因为我需要对降水执行相同的操作,然后将两个表连接在一起。将来,我将获得更多的天气变量,并且这个过程将很快变得很痛苦。

有人知道如何使用tidyverse更有效地做到这一点吗?

谢谢

PS:我看到的唯一类似的帖子涉及重新编码变量(使用mutate_at),或使用我在上面显示的names重命名列。

3 个答案:

答案 0 :(得分:2)

您可以这样做:

library(tidyverse)
df %>%
    gather(measure, value, -a, -b) %>% 
    separate(measure, into = c("type", "year"), sep = "_") %>% 
    mutate(type = case_when(type == "tmp" ~ "temp", type == "pre" ~ "precip")) %>% 
    spread(type, value)
#       a     b year  precip  temp
# 1     1     2 2000     100  23  
# 2     1     2 2001     103  22.1
# 3     1     2 2002     189  25  

我们首先以长格式收集所有数据,然后将年份与度量分开,然后更改度量名称,最后将数据散布为宽格式。

答案 1 :(得分:2)

data.frame(df)%>%
   reshape(3:ncol(df),sep="_",dir="long")%>%
   `rownames<-`(NULL)
  a b time  tmp pre id
1 1 2 2000 23.0 100  1
2 1 2 2001 22.1 103  1
3 1 2 2002 25.0 189  1

答案 2 :(得分:0)

df <- tibble(
  a = 1,
  b = 2,
  tmp_2000 = 23,
  tmp_2001 = 22.1,
  tmp_2002 = 25,
  pre_2000=100,
  pre_2001=103,
  pre_2002=189
)


df %>% 
  gather(key, value, -a:-b) %>% 
  separate(key, c("type", "year")) %>% 
  spread(type, value= value )

#> # A tibble: 3 x 5
#>       a     b year    pre   tmp
#>   <dbl> <dbl> <chr> <dbl> <dbl>
#> 1     1     2 2000    100  23  
#> 2     1     2 2001    103  22.1
#> 3     1     2 2002    189  25

```