R 用重复的列重塑数据

R 用重复的列重塑数据,r,reshape,R,Reshape,我正在尝试使用重塑来重构我的数据集 这是我的数据的一个子集,它是一个16 X 198的数据帧。每一个奇数列都是一个16年的列表,而偶数列则有不同国家的值 Algeria.x Algeria.y Argentina.x Argentina.y 1 1985 37.48 1985 27.86 2 1986 36.26 1986 27.52 3 1987 35.04 19

我正在尝试使用重塑来重构我的数据集

这是我的数据的一个子集,它是一个16 X 198的数据帧。每一个奇数列都是一个16年的列表,而偶数列则有不同国家的值

   Algeria.x Algeria.y Argentina.x Argentina.y
1       1985     37.48        1985       27.86
2       1986     36.26        1986       27.52
3       1987     35.04        1987       27.18
4       1988     33.82        1988       26.84
5       1989     32.60        1989       26.50
6       1990        NA        1990       25.50
7       1991        NA        1991       24.50
8       1992        NA        1992       23.50
9       1993        NA        1993       22.50
10      1994        NA        1994       21.50
11      1995        NA        1995       22.12
12      1996        NA        1996       22.74
13      1997        NA        1997       23.36
14      1998        NA        1998       23.98
15      1999        NA        1999       24.60
16      2000        NA        2000          NA

我想重塑数据,使其具有三列。第一个表示国家名称,第二个表示年份,第三个表示值。这将是一个1584 x 3的长矩阵。

在将数据拆分为两个数据帧后,我将使用
堆栈
函数两次。一个用于年份,一个用于值:

# split the data into two data.frames
years.df  <- df[, seq(from = 1, to = ncol(df), by = 2)]
values.df <- df[, seq(from = 2, to = ncol(df), by = 2)]

# remove ".x" and ".y" at the end of the country names
names(years.df)  <- sub("\\.x$", "", names(years.df))
names(values.df) <- sub("\\.y$", "", names(values.df))

# stack each data.frame into a two-column data.frame
years.stack  <- stack(years.df)
values.stack <- stack(values.df)

# gather everything into a single data.frame
final.df <- data.frame(country = years.stack$ind,
                       year    = years.stack$value,
                       value   = values.stack$value)
final.df
#      country year value
# 1    Algeria 1985 37.48
# 2    Algeria 1986 36.26
# 3    Algeria 1987 35.04
# 4    Algeria 1988 33.82
# 5    Algeria 1989 32.60
# 6    Algeria 1990    NA
# 7    Algeria 1991    NA
# 8    Algeria 1992    NA
# 9    Algeria 1993    NA
# 10   Algeria 1994    NA
# 11   Algeria 1995    NA
# 12   Algeria 1996    NA
# 13   Algeria 1997    NA
# 14   Algeria 1998    NA
# 15   Algeria 1999    NA
# 16   Algeria 2000    NA
# 17 Argentina 1985 27.86
# 18 Argentina 1986 27.52
# 19 Argentina 1987 27.18
# 20 Argentina 1988 26.84
# 21 Argentina 1989 26.50
# 22 Argentina 1990 25.50
# 23 Argentina 1991 24.50
# 24 Argentina 1992 23.50
# 25 Argentina 1993 22.50
# 26 Argentina 1994 21.50
# 27 Argentina 1995 22.12
# 28 Argentina 1996 22.74
# 29 Argentina 1997 23.36
# 30 Argentina 1998 23.98
# 31 Argentina 1999 24.60
# 32 Argentina 2000    NA
#将数据拆分为两个数据帧

years.df对于这样一个小的数据框,我想我可以简单地通过拆分原始数据的向量将其拼凑起来:

#read in your data
dat <- read.table(text="   Algeria.x Algeria.y Argentina.x Argentina.y
1       1985     37.48        1985       27.86
2       1986     36.26        1986       27.52
3       1987     35.04        1987       27.18
4       1988     33.82        1988       26.84
5       1989     32.60        1989       26.50
6       1990        NA        1990       25.50
7       1991        NA        1991       24.50
8       1992        NA        1992       23.50
9       1993        NA        1993       22.50
10      1994        NA        1994       21.50
11      1995        NA        1995       22.12
12      1996        NA        1996       22.74
13      1997        NA        1997       23.36
14      1998        NA        1998       23.98
15      1999        NA        1999       24.60
16      2000        NA        2000          NA")
#读入数据

dat假设您的数据集被称为“
df
”:原始答案(使用“重塑”包):


更新:更精简的方法 您可以利用所有国家都具有相同的年份值这一事实,从而使任何“
.x
”列成为
id.var
的潜在
id.var
,用于
melt
ing您的
数据.frame

仍然需要进行一点清理

library(reshape2)
names(df) <- gsub(".y", "", names(df))
df_long <- setNames(melt(df[, c("Algeria.x", grep(".x", names(df), 
                                                  invert=TRUE, value=TRUE))],
                         id.vars="Algeria.x"), c("Year", "Country", "Value"))
list(head(df_long), tail(df_long))
# [[1]]
#   Year Country Value
# 1 1985 Algeria 37.48
# 2 1986 Algeria 36.26
# 3 1987 Algeria 35.04
# 4 1988 Algeria 33.82
# 5 1989 Algeria 32.60
# 6 1990 Algeria    NA
# 
# [[2]]
#    Year   Country Value
# 27 1995 Argentina 22.12
# 28 1996 Argentina 22.74
# 29 1997 Argentina 23.36
# 30 1998 Argentina 23.98
# 31 1999 Argentina 24.60
# 32 2000 Argentina    NA
library(重塑2)

使用基本函数命名(df)一个衬里
重塑

reshape(dat, varying = 1:4, direction = 'long')

我能够为一个国家进行重塑,但无法为每个国家找出一个循环或其他代码来复制。如果数据框是“z”,我做了x,上面data.frame的子集看起来可能是合并的data.frames的结果,基于名称(algear.x、algear.y等)。通过在前一步进行干预,可以避免重新塑造df。如果你愿意,你能解释一下导致df的步骤吗?或者如果您满意,那么您可以将flodel的答案标记为已接受。我相信这是一个部分数据集,因此使用此解决方案可能会有点麻烦,需要重新键入所有国家的名称。它是16 x 198。根据堆叠的内容以及需要重复的id变量是什么,数据帧[rep(seq_len(nrow(dataframe)),repeats]
也可以派上用场。我同意键入太多的名称,gsub可能会派上用场,但如果有多个名称重复,则可能需要键入8个名称。正确,但16是原始数据集中的行数。我假设有99个国家。
library(reshape2)
names(df) <- gsub(".y", "", names(df))
df_long <- setNames(melt(df[, c("Algeria.x", grep(".x", names(df), 
                                                  invert=TRUE, value=TRUE))],
                         id.vars="Algeria.x"), c("Year", "Country", "Value"))
list(head(df_long), tail(df_long))
# [[1]]
#   Year Country Value
# 1 1985 Algeria 37.48
# 2 1986 Algeria 36.26
# 3 1987 Algeria 35.04
# 4 1988 Algeria 33.82
# 5 1989 Algeria 32.60
# 6 1990 Algeria    NA
# 
# [[2]]
#    Year   Country Value
# 27 1995 Argentina 22.12
# 28 1996 Argentina 22.74
# 29 1997 Argentina 23.36
# 30 1998 Argentina 23.98
# 31 1999 Argentina 24.60
# 32 2000 Argentina    NA
reshape(dat, varying = 1:4, direction = 'long')