应用函数并创建新行

时间:2014-09-15 08:18:08

标签: r

我有一个data.frame:

X  1976  1977
1   6.4   6.9
2   6.3   7.0
3   6.1   7.1
4   6.0   7.2

我想创建以下内容:

Qtr        Value
1976.00    6.27
1976.25    ...
And so on...
1977.00    7.0
1977.25    ...

等等。

编辑:输出是前3个值的平均值。道歉。

有人可以帮帮我吗?提前谢谢。

罗伯特

2 个答案:

答案 0 :(得分:3)

这是一种方法。

您的数据框:

dat <- read.table(text = "X  1976  1977
1   6.4   6.9
2   6.3   7.0
3   6.1   7.1
4   6.0   7.2", header = TRUE, check.names = FALSE)

命令:

agg <- aggregate(dat[-1], by = list((dat$X - 1) %/% 3), mean)
dat2 <- setNames(stack(agg[-1])[2:1], c("Qtr", "Value"))
dat2$Qtr <- agg[[1]] * 0.25 + as.numeric(as.character(dat2$Qtr))

结果:

dat2
#       Qtr    Value
# 1 1976.00 6.266667
# 2 1976.25 6.000000
# 3 1977.00 7.000000
# 4 1977.25 7.200000

答案 1 :(得分:-1)

尝试:

ddf = structure(list(X = 1:12, `1976` = c(6.4, 6.3, 6.1, 6, 6, 6.3, 
6.1, 6, 6.4, 6.8, 6.6, 6), `1977` = c(6.9, 7, 7.1, 7.2, 7.2, 
7.1, 7.2, 7.5, 7.2, 7.6, 7.8, 7.2)), .Names = c("X", "1976", 
"1977"), class = "data.frame", row.names = c(NA, -12L))

ddf
    X 1976 1977
1   1  6.4  6.9
2   2  6.3  7.0
3   3  6.1  7.1
4   4  6.0  7.2
5   5  6.0  7.2
6   6  6.3  7.1
7   7  6.1  7.2
8   8  6.0  7.5
9   9  6.4  7.2
10 10  6.8  7.6
11 11  6.6  7.8
12 12  6.0  7.2

df2 = data.frame(qtr =numeric(), value=numeric())
rr=1; x=0; new=TRUE
for(cc in 2:3)for(i in 1:4){
    if(cc==3 & new){
        rr = 1; x=0; new=FALSE;
    }
    df2[nrow(df2)+1,1] = as.numeric(names(ddf)[cc])+x
    x = x+0.25
    df2[nrow(df2),2] = mean(ddf[rr:(rr+3),cc])
    rr = rr+4
    if(rr>12) rr = 1
}
df2
      qtr value
1 1976.00  6.20
2 1976.25  6.10
3 1976.50  6.45
4 1976.75  6.20
5 1977.00  7.05
6 1977.25  7.25
7 1977.50  7.45
8 1977.75  7.05