我正在尝试找到一种使用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
temp
和pre
代表温度和降水。我想以整洁的形式重组此表,即,一列为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
重命名列。
答案 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
```