【发布时间】:2018-03-10 13:59:53
【问题描述】:
我有一个美朝近20年进出口的tibble,很多列名都是月份的名称,IJAN代表进口月份,EJAN代表出口月份,所以我用了gather()两次尝试以正确的 tidydata 格式获取它们。
这是我原来的小标题:
# A tibble: 26 x 29
year CTY_CODE CTYNAME IJAN IFEB IMAR IAPR IMAY IJUN IJUL IAUG ISEP IOCT INOV IDEC IYR EJAN EFEB EMAR EAPR EMAY EJUN EJUL EAUG ESEP
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1992 5790 Korea, N~ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.100 0. 0. 0. 0. 0. 0. 0.
2 1993 5790 Korea, N~ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
3 1994 5790 Korea, N~ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.200 0. 0. 0.
4 1995 5790 Korea, N~ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 6.60 0. 0. 4.20 0. 0. 0.200
5 1996 5790 Korea, N~ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.400 0. 0. 0. 0. 0.100
6 1997 5790 Korea, N~ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.100 0. 2.00 0. 0.300
7 1998 5790 Korea, N~ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 4.00 0. 0. 0.100 0. 0.300 0.
8 1999 5790 Korea, N~ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.100 0. 0. 0.300 0. 1.10 0.500 0.500
9 2000 5790 Korea, N~ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.100 0. 0. 0.100 2.50 0.100 0. 0. 0. 0. 0. 0.100 0.
10 2001 5790 Korea, N~ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
# ... with 16 more rows, and 4 more variables: EOCT <dbl>, ENOV <dbl>, EDEC <dbl>, EYR <dbl>
我第一次使用gather(),在导入月份工作,效果很好
USNKTrade <- USNKTrade %>% gather(contains("I"), key="month", value="ImportAmount")
导致
# A tibble: 338 x 18
year CTY_CODE CTYNAME EJAN EFEB EMAR EAPR EMAY EJUN EJUL EAUG ESEP EOCT ENOV EDEC EYR month ImportAmount
<chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
1 1992 5790 Korea, North 0. 0.100 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.100 IJAN 0.
2 1993 5790 Korea, North 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 2.00 0. 2.00 IJAN 0.
3 1994 5790 Korea, North 0. 0. 0. 0. 0. 0.200 0. 0. 0. 0. 0. 0. 0.200 IJAN 0.
4 1995 5790 Korea, North 0. 0. 6.60 0. 0. 4.20 0. 0. 0.200 0. 0.500 0.100 11.6 IJAN 0.
5 1996 5790 Korea, North 0. 0. 0. 0.400 0. 0. 0. 0. 0.100 0. 0. 0. 0.500 IJAN 0.
6 1997 5790 Korea, North 0. 0. 0. 0. 0.100 0. 2.00 0. 0.300 0. 0.100 0. 2.50 IJAN 0.
7 1998 5790 Korea, North 0. 0. 4.00 0. 0. 0.100 0. 0.300 0. 0. 0. 0. 4.40 IJAN 0.
8 1999 5790 Korea, North 0. 0.100 0. 0. 0.300 0. 1.10 0.500 0.500 0.500 0.600 7.70 11.3 IJAN 0.
9 2000 5790 Korea, North 2.50 0.100 0. 0. 0. 0. 0. 0.100 0. 0. 0. 0. 2.70 IJAN 0.
10 2001 5790 Korea, North 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.500 0.500 IJAN 0.
# ... with 328 more rows
但是当我尝试对导出做同样的事情时,使用
USNKTrade <- USNKTrade %>% gather(starts_with("E"), key="month", value="ExportAmount")
然后我得到一个大约 4000 行长的 tibble,而实际上我想要一个只有前一个的两倍大的 tibble(这样每个导入和导出月份都有自己的行)。
我们将不胜感激!谢谢
【问题讨论】:
-
请使用
dput展示一个可重现的小示例,并基于此显示预期输出 -
我认为问题在于您已连续应用
gather命令。当您第一次在contains("I")列上应用gather时,这些列已移至行。现在在结果data.frame上,您正在应用gather和starts_with("E")。显然它会导致更多的行,因为带有I列的行也会成倍增加。 -
请注意,最好使用
starts_with(),因为contains()也会检测到不是首字母的E和I。 -
@hpesoj626 至少作为问题的一部分,OP 共享的任何列似乎与
E和I没有冲突。也许 OP 明智地选择了starts_with来代替E,否则会有重叠。