r用于比较数据帧的每列的因子的连续级别的值

时间:2014-02-24 20:55:26

标签: r

我有一个数据框,其中包含9个变量的数据,每个变量在几个不同的条件下在7个站点(A-G)进行测量。

    my.df <- structure(list(Condition = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L), .Label = c("Cond1", "Cond2", "Cond3", 
"Cond4", "Cond5", "Cond6", "Cond7", "Cond8"), class = "factor"), 
    Site = structure(c(6L, 7L, 3L, 5L, 4L, 2L, 1L, 6L, 7L, 3L, 
    5L, 4L, 2L, 1L, 6L, 7L, 3L, 5L, 4L, 2L, 1L, 6L, 7L, 3L, 5L, 
    4L, 2L, 1L), .Label = c("A", "B", "C", "D", "E", "F", "G"
    ), class = "factor"), Variable1 = c(0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0.00333333333333333, 0, 0.00333333333333333, 0.0233333333333333, 
    0.02, 0, 0.00333333333333333, 0.0133333333333333, 0, 0.03, 
    0.376666666666667, 0.07, 0, 0, 0.0133333333333333, 0, 0, 
    0.256666666666667, 0.16), Variable2 = c(0.04, 0.0233333333333333, 
    0.0466666666666667, 0.256666666666667, 0.02, 0.07, 0.48, 
    0.0466666666666667, 0.0766666666666667, 0.0266666666666667, 
    0.08, 0.04, 0.136666666666667, 0.15, 0.433333333333333, 0.16, 
    1.69666666666667, 0.14, 1.99666666666667, 3.66, 3.18, 0.04, 
    0.0633333333333333, 0.446666666666667, 0.0733333333333333, 
    0.54, 1.83666666666667, 2.01), Variable3 = c(7.64333333333333, 
    5.16333333333333, 16.84, 2.52333333333333, 1.35333333333333, 
    27.2666666666667, 17.36, 1.48666666666667, 0.596666666666667, 
    8.07333333333333, 4.77, 3.4, 6.86666666666667, 4.26, 23.6466666666667, 
    16.87, 42.1766666666667, 20.23, 33.03, 52.37, 50.46, 9.19333333333333, 
    5.09, 13.6833333333333, 11.4566666666667, 16.1133333333333, 
    26.59, 23.76), Variable4 = c(1.86333333333333, 1.41666666666667, 
    0.263333333333333, 0.953333333333333, 0.28, 0.323333333333333, 
    0.28, 1.85, 1.43666666666667, 1.16, 1.28, 2.48, 3.49666666666667, 
    3.79, 15.96, 16.6466666666667, 16.8166666666667, 10.0933333333333, 
    16.9666666666667, 17.5633333333333, 19.83, 6.61, 6.20333333333333, 
    5.72, 5.13, 6.78333333333333, 8.94333333333333, 9.66), Variable5 = c(23.84, 
    23.91, 14.11, 18.5633333333333, 16.8933333333333, 9.37, 11.34, 
    33.63, 35.4633333333333, 24.04, 32.3066666666667, 20.8166666666667, 
    25.4466666666667, 25.14, 24.33, 24.9766666666667, 10.5966666666667, 
    17.4333333333333, 12.99, 10.1133333333333, 10.18, 33.9166666666667, 
    32.3433333333333, 18.3666666666667, 25.8766666666667, 17.7633333333333, 
    18.7466666666667, 18.71), Variable6 = c(7.47333333333333, 
    8.04, 16.4033333333333, 17.1866666666667, 16.5533333333333, 
    3.82666666666667, 4.39, 28.6466666666667, 37.14, 27.23, 35.54, 
    17.47, 17.84, 16.43, 10.5, 14.88, 6.04, 16.45, 8.90333333333333, 
    3.75666666666667, 3.55, 32.4533333333333, 28.2366666666667, 
    17.36, 26.2766666666667, 14.5266666666667, 11.9766666666667, 
    11.11), Variable7 = c(21.6933333333333, 21.27, 8.95666666666667, 
    15.73, 9.61333333333333, 14.9166666666667, 18.07, 18.43, 
    12.0466666666667, 13.7433333333333, 9.78, 25.76, 27.4066666666667, 
    31.42, 10.4966666666667, 8.57, 8.59333333333333, 8.36, 7.97333333333333, 
    6.08, 7.03, 7.28333333333333, 11.82, 19.3533333333333, 10.1366666666667, 
    19.27, 18.9833333333333, 21.19), Variable8 = c(19.4866666666667, 
    19.9766666666667, 25.7, 21.1966666666667, 38.0266666666667, 
    36.04, 40.49, 2.54666666666667, 1.83, 11.0133333333333, 3.76, 
    13.5633333333333, 5.42, 6.16, 4.58666666666667, 5.75333333333333, 
    8.76666666666667, 13.52, 10.41, 3.95666666666667, 4.56, 1.51, 
    3.45333333333333, 12.2333333333333, 6.62333333333333, 11.9566666666667, 
    4.67, 5.18), Variable9 = c(17.97, 20.1866666666667, 17.6633333333333, 
    23.61, 17.27, 8.18, 7.6, 13.3533333333333, 11.3933333333333, 
    14.7, 12.48, 16.4766666666667, 13.3666666666667, 12.64, 10.07, 
    12.1466666666667, 5.30666666666667, 13.78, 7.7, 2.13333333333333, 
    1.12, 8.98, 12.79, 12.83, 14.4133333333333, 13.0433333333333, 
    8.00666666666667, 8.23)), .Names = c("Condition", "Site", 
"Variable1", "Variable2", "Variable3", "Variable4", "Variable5", 
"Variable6", "Variable7", "Variable8", "Variable9"), row.names = c(NA, 
-28L), class = "data.frame")

现在,对于每个变量,在每个条件下,我想比较每个连续站点(A到G)的值。如果站点B的x值大于站点A的值,我想用站点A值替换站点B值。另外,我想创建另一个列Y,并在Y中输入B处的x和A处的x之间的差值(假设B> A)。

然后我想继续对网站B和C进行相同的比较(如果C> B,用B替换C,并将差异放在Y列中)。在比较所有站点的值之后,继续为每个条件下的每个变量做同样的事情。

我想编写一个函数来自动为我做所有这些比较。我可以使用lapply在colnames上运行该函数(为每个变量运行它),我想我可以使用ave(在lapply调用内)在子集“上运行我的内部函数”条件”。逻辑参数非常简单,但我不知道如何调用因子(站点A到G)的连续级别的值。基本上,内部函数(由ave内的lapply调用)将是这样的: 编辑:也许我是在重新考虑事情,不需要'lapply',而只能使用'by'而不是......但问题仍然存在

 for(i in 1:length(levels(my.df$Site)){
   if(levels(my.df$Site)[i+1] > levels(my.df$Site)[i]) {
     print(levels(my.df$Site)[i])  
     #But this isn't right, because I want the *value*, not the factor
   }
 })

必须有办法做到这一点;有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

我决定试一试,虽然我不确定我完全理解这个问题。

由于您想要将一个函数应用于“Condition”和“Variable”的每个组合,我认为您可以将my.df转换为长格式,在每个“cond~var”中拆分并应用一个函数。以下假设每个“cond~var”只有只有一个“站点”。我希望你能找到一些有用的东西:

my_long_df = reshape(my.df, direction = "long", 
                     idvar = c("Condition", "Site"), 
                     varying = list(3:11),
                     timevar = "Variable", v.names = "value")

spl_ldf = split(my_long_df, 
                 interaction(my_long_df$Condition, my_long_df$Variable, drop = T))

ff = function(x) {
  x = x[match(levels(my.df$Site), x$Site), ]
  x$Y = c(NA, diff(x$value))
  valT = head(x$value, -1)
  valF = x$value[-1]
  x$newvals = c(NA, ifelse(x$Y[-1] > 0, valT, valF))  
  return(x)
}
res = do.call(rbind, lapply(spl_ldf, ff))
res[29:49, ]  #just a subset of the output
#                  Condition Site Variable      value           Y    newvals
#Cond1.2.Cond1.A.2     Cond1    A        2 0.48000000          NA         NA
#Cond1.2.Cond1.B.2     Cond1    B        2 0.07000000 -0.41000000 0.07000000
#Cond1.2.Cond1.C.2     Cond1    C        2 0.04666667 -0.02333333 0.04666667
#Cond1.2.Cond1.D.2     Cond1    D        2 0.02000000 -0.02666667 0.02000000
#Cond1.2.Cond1.E.2     Cond1    E        2 0.25666667  0.23666667 0.02000000
#Cond1.2.Cond1.F.2     Cond1    F        2 0.04000000 -0.21666667 0.04000000
#Cond1.2.Cond1.G.2     Cond1    G        2 0.02333333 -0.01666667 0.02333333
#Cond2.2.Cond2.A.2     Cond2    A        2 0.15000000          NA         NA
#Cond2.2.Cond2.B.2     Cond2    B        2 0.13666667 -0.01333333 0.13666667
#Cond2.2.Cond2.C.2     Cond2    C        2 0.02666667 -0.11000000 0.02666667
#Cond2.2.Cond2.D.2     Cond2    D        2 0.04000000  0.01333333 0.02666667
#Cond2.2.Cond2.E.2     Cond2    E        2 0.08000000  0.04000000 0.04000000
#Cond2.2.Cond2.F.2     Cond2    F        2 0.04666667 -0.03333333 0.04666667
#Cond2.2.Cond2.G.2     Cond2    G        2 0.07666667  0.03000000 0.04666667
#Cond3.2.Cond3.A.2     Cond3    A        2 3.18000000          NA         NA
#Cond3.2.Cond3.B.2     Cond3    B        2 3.66000000  0.48000000 3.18000000
#Cond3.2.Cond3.C.2     Cond3    C        2 1.69666667 -1.96333333 1.69666667
#Cond3.2.Cond3.D.2     Cond3    D        2 1.99666667  0.30000000 1.69666667
#Cond3.2.Cond3.E.2     Cond3    E        2 0.14000000 -1.85666667 0.14000000
#Cond3.2.Cond3.F.2     Cond3    F        2 0.43333333  0.29333333 0.14000000
#Cond3.2.Cond3.G.2     Cond3    G        2 0.16000000 -0.27333333 0.16000000