如何使用 gather() 函数指定多列来整理数据

How to specify multiple columns with gather() function to tidy data

我想用收集函数整理我的数据,但如何一次指定多个列?

假设这是我的数据:

    Country Country.Code Year X0tot4 X5tot9 X10tot14 X15tot19 X20tot24
1  Viet Nam          704 1955   4606   2924     2389     2340     2502
2  Viet Nam          704 1960   5842   4410     2860     2356     2318
3  Viet Nam          704 1965   6571   5646     4328     2823     2335
4  Viet Nam          704 1970   7065   6391     5548     4271     2797
5  Viet Nam          704 1975   7658   6862     6237     5437     4208
6  Viet Nam          704 1980   7991   7473     6754     6113     5266
7  Viet Nam          704 1985   8630   7855     7375     6657     6027
8  Viet Nam          704 1990   9212   8513     7770     7277     6571
9  Viet Nam          704 1995   9200   9099     8447     7702     7140
10 Viet Nam          704 2000   7245   9119     9053     8402     7610
11 Viet Nam          704 2005   6760   7140     8997     8951     8257
12 Viet Nam          704 2010   7277   6657     7015     8891     8775
13 Viet Nam          704 2015   7753   7233     6623     6982     8817

现在我想用 X0tot4X20tot24 的变量创建一个新列 Age.groups

类似于 df %>% gather(key = "Age.group", value = c(4:8))。控制台说这不是正确的列规范。但是什么是?

Psidom 的回答很好。或者,您可以使用“-”排除列。

df %>% gather(key = "Age.group", value = value, -Country, -Country.Code, -Year)

gather函数中,value指定结果中值列的名称;要指定要 收集 的列,您可以使用 start_column:end_column 语法,这将收集从 start_columnend_column;在您的情况下,它将是 X0tot4:X20tot24:

df %>% gather(key = 'Age.group', value = 'Value.name', X0tot4:X20tot24)
#                        V                     V
#                              V               V
#                                    V         V
#      Country Country.Code Year Age.group Value.name
#1   Viet Nam           704 1955    X0tot4       4606
#2   Viet Nam           704 1960    X0tot4       5842
#3   Viet Nam           704 1965    X0tot4       6571
#4   Viet Nam           704 1970    X0tot4       7065
#5   Viet Nam           704 1975    X0tot4       7658
#6   Viet Nam           704 1980    X0tot4       7991
#7   Viet Nam           704 1985    X0tot4       8630

我们也可以通过匹配一个字符串来指定gather的列。以下都行。

library(tidyverse)

# Match by the beginning of a string with a pattern
df %>% gather(Age.group, Value.name, starts_with("X"))

# Match by if a string containing a pattern
df %>% gather(Age.group, Value.name, contains("X"))

# Match by a regular expression pattern
df %>% gather(Age.group, Value.name, matches("X"))