【发布时间】:2018-08-05 20:53:51
【问题描述】:
我正在尝试找到一种使用 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 重命名列。
【问题讨论】:
-
reshape(df,3:ncol(df),sep="_",dir="long") -
Onyambu 这没用,我得到
Warning messages: 1: Setting row names on a tibble is deprecated. 2: Setting row names on a tibble is deprecated. 3: Setting row names on a tibble is deprecated. -
警告是因为你有一个
tibble仅此而已。即你可以做reshape(data.frame(df),3:ncol(df),idvar = 1:2,sep="_",dir="long")然后将rownames设置为NULL -
好的,谢谢。比 tidyverse 更简洁,但可读性较差。
-
可读性差是什么意思?我想可能是因为
reshape这个函数对你来说是新的??我不知道..你也许可以使用data.table::melt