嗨,我是R的新手并且有一个问题。我有一个data.frame(df),包含了1960年至2012年约100个不同国家的约30种不同类型的统计数据。以下是它的外观示例:
Country Statistic.Type 1960 1961 1962 1963 ... 2012
__________________________________________________________________________________
1 Albania Death Rate 10 21 13 24 25
2 Albania Birth Rate 7 15 6 10 9
3 Albania Life Expectancy 8 12 10 7 20
4 Albania Population 10 30 27 18 13
5 Brazil Death Rate 14 20 22 13 18
6 Brazil Birth Rate ...
7 Brazil Life Expectancy ...
8 Brazil Population ...
9 Cambodia Death Rate ...
10 Cambodia Birth Rate ... etc...
请注意,总共有55列,53年列中每个列的值都是为了这个问题而编写的。
我需要帮助编写一个函数,该函数将国家和统计类型作为输入,并返回一个新的data.frame,其中包含2列,显示给定国家/地区和统计类型的每年的年份和值。例如,如果我将country = Brazil和statistic.type = Death Rate输入到函数中,则新的data.frame应如下所示:
Year Value
_____________________
1 1960 14
2 1961 20
3 1962 22
...
51 2012 18
我不知道如何做到这一点,如果有人可以给我任何想法/代码/包安装,那将是非常有帮助的。
非常感谢你!
答案 0 :(得分:1)
如果df
是您的data.frame,您只需要:
f <- function(country, statistic.type, data=df)
{
values <- data[data$Country==country & data$Statistic.Type==statistic.type,-(1:2)]
cbind(Year=names(df)[-(1:2)], Value=values)
}
将其用作
f(country="Brazil", statistic.type="Death Rate")
答案 1 :(得分:0)
您可能需要对总数据集执行一些拆分操作才能拥有国家/地区的数据集。 https://stat.ethz.ch/pipermail/r-help/2008-February/155328.html
然后对每个数据子集使用融合函数。在你的情况下,改编自 http://www.statmethods.net/management/reshape.html,其中mydata是已经拆分的数据:
% example of melt function
library(reshape)
mdata <- melt(mydata, id=c("Year"))
就是这样。
答案 2 :(得分:0)
您可以将subset
与stack
合并,可能只有gsub
,只留下您的年份列中的数字:
df <- expand.grid(
"country" = c("A", "B"),
"statistic" = c("c", "d", "e", "f"),
stringsAsFactors = FALSE)
df$year1980 <- rnorm(8)
df$year1990 <- rnorm(8)
df$year2000 <- rnorm(8)
getYears <- function(input, cntry, stat) {
x <- subset(input, country == cntry & stat == statistic,
select = -c(country, statistic))
x <- stack(x)[,c("ind", "values")]
x$ind <- gsub("\\D", "", x$ind)
x
}
getYears(df, "A", "c")
ind values
1 1980 1.1421309
2 1990 1.0777974
3 2000 -0.2010913